From 4a9dc6f2c477aa8553645238f25f30e9446c71af Mon Sep 17 00:00:00 2001 From: Francesc Verdugo Date: Mon, 9 Sep 2024 13:15:34 +0200 Subject: [PATCH] Changes in jacobi method --- notebooks/figures/fig_jacobi.svg | 259545 ++++++++++++++-------------- notebooks/jacobi_method.ipynb | 683 +- 2 files changed, 130360 insertions(+), 129868 deletions(-) diff --git a/notebooks/figures/fig_jacobi.svg b/notebooks/figures/fig_jacobi.svg index 14fa8e2..8e33062 100644 --- a/notebooks/figures/fig_jacobi.svg +++ b/notebooks/figures/fig_jacobi.svg @@ -2453,7 +2453,82 @@ preserveAspectRatio="xMidYMid">u + y="397.56329" + x="317.88235" + height="5.1131492" + width="5.1131492" + id="rect22976" + style="fill:none;fill-opacity:0.21383099;stroke:#999999;stroke-width:0.41446099;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + inkscape:export-filename="/home/francesc/fig.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />u + u_new + xml:space="preserve" + id="text913" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect915);display:inline" + transform="matrix(1.4271981,0,0,1.4271981,9.7874736,-51.2501)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_01.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">u_new + u_new[i] = u[i-1]+u[i]+u[1+1] + xml:space="preserve" + id="text913-5" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect915-3);display:inline" + transform="matrix(1.0875997,0,0,1.0875997,-126.65587,19.474337)">u_new[i] = u[i-1]+u[i]+u[1+1] + i + xml:space="preserve" + id="text959" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect961);display:inline" + transform="translate(12.160803,-20.886102)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_01.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i + i + xml:space="preserve" + id="text959-2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect961-6);display:inline" + transform="translate(12.293888,-34.806332)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_01.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i + i+1 + xml:space="preserve" + id="text959-2-1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect961-6-9);display:inline" + transform="translate(15.491896,-34.766989)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_01.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i+1 + i-1 + xml:space="preserve" + id="text1042" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect1044);display:inline" + transform="translate(4.3439486,-34.841938)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_01.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i-1 + i + style="fill:none;fill-opacity:0.21383099;stroke:#000000;stroke-width:0.41446099;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="rect881-2" + width="5.1131492" + height="5.1131492" + x="-66.899704" + y="129.4238" />i + i+1 + xml:space="preserve" + id="text959-2-1-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect961-6-9-63);display:inline" + transform="translate(35.810732,9.3633895)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_02.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i+1 + i-1 + xml:space="preserve" + id="text1042-1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect1044-2);display:inline" + transform="translate(11.400351,9.2884405)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_02.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i-1 + i + xml:space="preserve" + id="text959-2-0-5" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect961-6-0-5);display:inline" + transform="translate(18.288668,23.738415)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_02.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i + i + style="fill:none;fill-opacity:0.21383099;stroke:#b3b3b3;stroke-width:0.41446099;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="rect1636" + width="5.1131492" + height="5.1131492" + x="31.003565" + y="103.94331" + inkscape:export-filename="/home/fverdugo/fig_jacobi_03.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />i + i+1 + xml:space="preserve" + id="text1712" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect1734);display:inline" + transform="translate(40.653883,50.747923)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_03.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i+1 + i-1 + xml:space="preserve" + id="text1718" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect1736);display:inline" + transform="translate(16.273224,50.672973)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_03.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i-1 + i + xml:space="preserve" + id="text1724" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect1738);display:inline" + transform="translate(37.392159,65.122943)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_03.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i + u + style="fill:none;stroke:#000000;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2176)" + d="m 98.441629,66.298883 -10.467053,8.86416" + id="path1740" + sodipodi:nodetypes="cc" + inkscape:export-filename="/home/fverdugo/fig_jacobi_02.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" + inkscape:connector-curvature="0" />u + u_new + xml:space="preserve" + id="text913-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect915-69);display:inline" + transform="matrix(1.4271981,0,0,1.4271981,0.59033197,-5.5461485)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_02.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">u_new + u + xml:space="preserve" + id="text2492" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect2500);display:inline" + transform="matrix(1.4271981,0,0,1.4271981,10.821586,22.823775)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_03.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">u + u_new + xml:space="preserve" + id="text2498" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect2502);display:inline" + transform="matrix(1.4271981,0,0,1.4271981,0.79238917,35.83206)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_03.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">u_new + u + id="g2524" + transform="translate(287.87937,93.565976)">u + u_new + xml:space="preserve" + id="text2604" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.53135px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect2616);display:inline;stroke-width:1.4272" + x="303.30276" + y="157.34677">u_new + u + style="fill:none;stroke:#000000;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2720)" + d="m 390.04129,231.19815 10.46705,8.86416" + id="path2716" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" />u + u + style="fill:none;fill-opacity:0.21383099;stroke:#999999;stroke-width:0.41446099;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="rect3530" + width="5.1131492" + height="5.1131492" + x="25.499876" + y="330.13641" />u + u_new + xml:space="preserve" + id="text2604-9" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect2616-6);display:inline" + transform="matrix(1.4271981,0,0,1.4271981,1.203472,82.30629)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_04.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">u_new + u + style="fill:none;stroke:#000000;stroke-width:0.26458299px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5508)" + d="m 48.984732,149.32896 c 4.37627,-5.8476 9.03933,-7.96173 14.49463,0.23794" + id="path5498" + sodipodi:nodetypes="cc" + inkscape:export-filename="/home/fverdugo/fig_jacobi_04.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" + inkscape:connector-curvature="0" />u + u_new + xml:space="preserve" + id="text6200" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect6212);display:inline" + transform="matrix(1.4271981,0,0,1.4271981,1.203472,121.24415)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_05.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">u_new + i + xml:space="preserve" + id="text959-2-0-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect961-6-0-9);display:inline" + transform="translate(18.883452,136.71895)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_05.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i + i-1 + xml:space="preserve" + id="text1042-1-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect1044-2-1);display:inline" + transform="translate(10.933512,136.68334)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_05.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i-1 + i+1 + xml:space="preserve" + id="text959-2-1-1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect961-6-9-1);display:inline" + transform="translate(22.568892,136.90284)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_05.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i+1 + i + xml:space="preserve" + id="text6641" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect6643);display:inline" + transform="translate(18.883452,150.94011)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_05.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i + chnl_next_snd + style="fill:none;fill-opacity:0.21383099;stroke:#999999;stroke-width:0.41446099;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="rect4812-5" + width="5.1131492" + height="5.1131492" + x="50.457565" + y="240.19113" + inkscape:export-filename="/home/fverdugo/fig_jacobi_06.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />chnl_next_snd + chnl_next_rcv + xml:space="preserve" + id="text7539" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect7541);display:inline" + transform="matrix(1.1643009,0,0,1.1643009,77.843253,183.39563)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_06.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">chnl_next_rcv + chnl_prev_rcv + xml:space="preserve" + id="text7545" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect7547);display:inline" + transform="matrix(1.1643009,0,0,1.1643009,5.2445442,162.48494)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_06.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">chnl_prev_rcv + chnl_prev_snd + xml:space="preserve" + id="text7551" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect7553);display:inline" + transform="matrix(1.1643009,0,0,1.1643009,5.2445442,183.18625)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_06.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">chnl_prev_snd + x + style="fill:none;fill-opacity:0.21383099;stroke:#999999;stroke-width:0.40000001;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="rect7688" + width="118.46274" + height="30.36175" + x="9.8201971" + y="55.870659" + inkscape:export-filename="/home/fverdugo/fig_jacobi_02.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />x + u + xml:space="preserve" + id="text7926-5" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:'DejaVu Serif';-inkscape-font-specification:'DejaVu Serif';letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect7928-1);display:inline" + transform="translate(-30.810978,-18.450956)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_00.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">u + 0 + style="fill:none;stroke:#000000;stroke-width:0.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 159.27206,63.160935 185.96774,47.74818" + id="path7968" + inkscape:export-filename="/home/fverdugo/fig_jacobi_00.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" + inkscape:connector-curvature="0" />0 + L + xml:space="preserve" + id="text8018" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:'DejaVu Serif';-inkscape-font-specification:'DejaVu Serif';letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8020);display:inline" + transform="translate(2.7314027,-3.5659799)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_00.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">L + -1 + xml:space="preserve" + id="text7926-8-8" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:'DejaVu Serif';-inkscape-font-specification:'DejaVu Serif';letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect7928-9-4);display:inline" + transform="translate(-31.634015,-9.1972281)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_00.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">-1 + 1 + xml:space="preserve" + id="text8063" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:'DejaVu Serif';-inkscape-font-specification:'DejaVu Serif';letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8065);display:inline" + transform="translate(-30.51952,-24.926584)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_00.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">1 + 0 + style="fill:none;fill-opacity:0.21383099;stroke:#b3b3b3;stroke-width:0.40000001;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="rect8067" + width="51.541916" + height="30.360323" + x="146.74063" + y="42.415016" + inkscape:export-filename="/home/fverdugo/fig_jacobi_00.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />0 + L + xml:space="preserve" + id="text8089" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:'DejaVu Serif';-inkscape-font-specification:'DejaVu Serif';letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8093);display:inline" + transform="matrix(1.6102189,0,0,1.6102189,-93.199416,-21.582516)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">L + n+2 points + style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.83880401;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="path8095" + cx="145.4012" + cy="89.229652" + r="0.78525126" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />n+2 points + u + style="fill:none;fill-opacity:0.21383099;stroke:#999999;stroke-width:0.41446099;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="rect847-5-7" + width="5.1131492" + height="5.1131492" + x="199.43674" + y="101.43358" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />u + ? + style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.83880401;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="circle8233" + cx="155.5562" + cy="89.229652" + r="0.78525126" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />? + -1 + xml:space="preserve" + id="text8239-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8241-8);display:inline" + transform="translate(-14.218663,-11.232213)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">-1 + ? + xml:space="preserve" + id="text8283" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8285);display:inline" + transform="translate(-2.6860555,-10.953948)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + xml:space="preserve" + id="text8289" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8291);display:inline" + transform="translate(2.3618091,-10.953948)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + xml:space="preserve" + id="text8295" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8297);display:inline" + transform="translate(7.4569611,-10.953948)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + xml:space="preserve" + id="text8301" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8303);display:inline" + transform="translate(12.509474,-10.953948)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + xml:space="preserve" + id="text8307" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8309);display:inline" + transform="translate(17.581147,-10.953948)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + xml:space="preserve" + id="text8313" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8315);display:inline" + transform="translate(22.63332,-10.953948)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + xml:space="preserve" + id="text8319" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8321);display:inline" + transform="translate(27.55798,-10.953948)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + xml:space="preserve" + id="text8325" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8327);display:inline" + transform="translate(32.745809,-10.953948)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + xml:space="preserve" + id="text8331" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8333);display:inline" + transform="translate(37.968566,-10.953948)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + 1 + xml:space="preserve" + id="text8339" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8341);display:inline" + transform="translate(43.034436,-11.232213)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">1 + u + style="fill:none;fill-opacity:0.21383099;stroke:#b3b3b3;stroke-width:0.40000001;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="rect8343" + width="73.276924" + height="34.727634" + x="134.87619" + y="77.254333" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />u + u_new + xml:space="preserve" + id="text8511" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8525);display:inline" + transform="matrix(1.4271981,0,0,1.4271981,142.10574,80.958983)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_09.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">u_new + i + style="fill:none;stroke:#000000;stroke-width:0.26458299px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker8529)" + d="m 244.05296,155.37715 c -4.37627,5.8476 -9.03933,7.96173 -14.49463,-0.23794" + id="path8519" + sodipodi:nodetypes="cc" + inkscape:export-filename="/home/fverdugo/fig_jacobi_09.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" + inkscape:connector-curvature="0" />i + i-1 + xml:space="preserve" + id="text1042-1-7-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect1044-2-1-7);display:inline" + transform="translate(152.22436,96.450149)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_09.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i-1 + i+1 + xml:space="preserve" + id="text959-2-1-1-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect961-6-9-1-1);display:inline" + transform="translate(163.85974,96.669649)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_09.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i+1 + i + xml:space="preserve" + id="text8984" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8986);display:inline" + transform="translate(160.1743,110.50673)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_09.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i + i + style="fill:none;fill-opacity:0.21383099;stroke:#999999;stroke-width:0.41446099;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="rect833-2-5" + width="5.1131492" + height="5.1131492" + x="287.3895" + y="56.141167" + inkscape:export-filename="/home/fverdugo/fig_jacobi_07.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />i + i+1 + xml:space="preserve" + id="text959-2-1-6-1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect961-6-9-63-4);display:inline" + transform="translate(292.19666,2.9457844)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_07.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i+1 + i-1 + xml:space="preserve" + id="text1042-1-0" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect1044-2-6);display:inline" + transform="translate(267.78628,2.8708354)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_07.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i-1 + i + xml:space="preserve" + id="text959-2-0-5-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect961-6-0-5-4);display:inline" + transform="translate(274.6746,17.32081)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_07.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i + u + xml:space="preserve" + id="text905-3-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect907-5-4);display:inline" + transform="matrix(1.4271981,0,0,1.4271981,267.00546,-24.972038)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_07.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">u + u_new + xml:space="preserve" + id="text913-7-9" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect915-69-2);display:inline" + transform="matrix(1.4271981,0,0,1.4271981,256.97626,-11.963754)" + inkscape:export-filename="/home/fverdugo/fig_jacobi_07.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">u_new + k + style="fill:none;fill-opacity:0.21383099;stroke:#999999;stroke-width:0.40000001;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="rect7688-9" + width="118.46274" + height="30.36175" + x="266.20612" + y="49.453053" + inkscape:export-filename="/home/fverdugo/fig_jacobi_07.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />k + i + style="fill:none;fill-opacity:0.21383099;stroke:#000000;stroke-width:0.41446099;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="rect845-7-7-3-2" + width="5.1131492" + height="5.1131492" + x="385.78604" + y="117.71471" + inkscape:export-filename="/home/fverdugo/fig_jacobi_07.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />i + j + xml:space="preserve" + id="text9964" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect9966);display:inline" + transform="matrix(1.2590406,0,0,1.2590406,-72.026455,-55.502641)">j + u + style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.71913201;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="path10004" + cx="398.36484" + cy="135.45958" + r="0.2648657" />u + u + y="-115.8666" + x="303.75595" + xml:space="preserve" + id="text2604-9-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.53135px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect2616-6);display:inline;stroke-width:1.4272" + inkscape:export-filename="/home/fverdugo/fig_jacobi_04.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">u + u + style="fill:none;fill-opacity:0.21383099;stroke:#999999;stroke-width:0.40000001;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="rect7706-6" + width="118.46274" + height="30.36175" + x="302.54532" + y="-54.082436" + inkscape:export-filename="/home/fverdugo/fig_jacobi_04.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />u + u_new + y="-62.549561" + x="444.57108" + xml:space="preserve" + id="text8511-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.53135px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8525);display:inline;stroke-width:1.4272" + inkscape:export-filename="/home/francesc/Downloads/fig16.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">u_new + i + style="fill:none;stroke:#000000;stroke-width:0.26458299px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker8529-3)" + d="m 546.51829,11.868604 c -4.37627,5.847601 -9.03933,7.961731 -14.49463,-0.237939" + id="path8519-2" + sodipodi:nodetypes="cc" + inkscape:export-filename="/home/francesc/Downloads/fig16.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" + inkscape:connector-curvature="0" />i + i-1 + y="-47.058395" + x="454.6897" + xml:space="preserve" + id="text1042-1-7-4-5" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect1044-2-1-7);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/Downloads/fig16.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i-1 + i+1 + y="-46.838898" + x="466.32507" + xml:space="preserve" + id="text959-2-1-1-4-8" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect961-6-9-1-1);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/Downloads/fig16.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i+1 + i + y="-33.001816" + x="462.63965" + xml:space="preserve" + id="text8984-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8986);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/Downloads/fig16.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i + k + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.99745px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect9966-6);display:inline;stroke-width:1.25904" + id="text9964-6-6" + xml:space="preserve" + x="28.437698" + y="-55.022057">k + i + inkscape:export-ydpi="200" + inkscape:export-xdpi="200" + inkscape:export-filename="/home/francesc/fig_jacobi_07.png" + y="82.523773" + x="502.08047" + height="5.1131492" + width="5.1131492" + id="rect845-7-7-3-2-3" + style="fill:none;fill-opacity:0.21383099;stroke:#000000;stroke-width:0.41446099;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" />i + j + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.99745px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect9966);display:inline;stroke-width:1.25904" + id="text9964-1" + xml:space="preserve" + x="44.267975" + y="-90.693573">j + xxxxxxxxxxxxxxxxxxxxxxxxxxxx????????????????????????????????????k + xml:space="preserve" + id="flowRoot2594" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" + transform="matrix(0.13538926,0,0,0.13538926,425.97708,25.633838)" + inkscape:export-filename="/home/francesc/fig_jacobi_07.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">xxxxxxxxxxxxxxxxxxxxxxxxxxxx????????????????????????????????????k + i + inkscape:export-ydpi="200" + inkscape:export-xdpi="200" + inkscape:export-filename="/home/francesc/Downloads/fig18.png" + y="104.32905" + x="567.77881" + height="5.1131492" + width="5.1131492" + id="rect845-7-7-3-2-4" + style="fill:#648fff;fill-opacity:1;stroke:#000000;stroke-width:0.41446099;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" />i + j + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.99745px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect9966);display:inline;stroke-width:1.25904" + id="text9964-3" + xml:space="preserve" + x="109.96632" + y="-68.888298">j + 1D block2D block2D cyclicxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxu + style="fill:#648fff;fill-opacity:1;stroke:#000000;stroke-width:0.41446099;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="rect3517" + width="5.1131492" + height="5.1131492" + x="621.90088" + y="104.32905" + inkscape:export-filename="..\..\..\assets\fig-pdes-2d-partition.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />1D block2D block2D cyclicxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxu + ? + y="-464.78333" + x="585.85327" + xml:space="preserve" + id="text8239-0" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8241);display:inline;stroke-width:1" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + -1 + y="-465.06158" + x="579.52283" + xml:space="preserve" + id="text8239-7-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8241-8);display:inline;stroke-width:1" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">-1 + ? + y="-464.78333" + x="591.05542" + xml:space="preserve" + id="text8283-8" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8285);display:inline;stroke-width:1" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + y="-464.78333" + x="596.10333" + xml:space="preserve" + id="text8289-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8291);display:inline;stroke-width:1" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + y="-464.78333" + x="601.19843" + xml:space="preserve" + id="text8295-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8297);display:inline;stroke-width:1" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + y="-464.78333" + x="606.25098" + xml:space="preserve" + id="text8301-2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8303);display:inline;stroke-width:1" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + y="-464.78333" + x="611.32263" + xml:space="preserve" + id="text8307-0" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8309);display:inline;stroke-width:1" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + y="-464.78333" + x="616.37482" + xml:space="preserve" + id="text8313-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8315);display:inline;stroke-width:1" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + y="-464.78333" + x="621.2995" + xml:space="preserve" + id="text8319-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8321);display:inline;stroke-width:1" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + y="-464.78333" + x="626.4873" + xml:space="preserve" + id="text8325-1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8327);display:inline;stroke-width:1" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + y="-464.78333" + x="631.71008" + xml:space="preserve" + id="text8331-0" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8333);display:inline;stroke-width:1" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + 1 + y="-465.06158" + x="636.77594" + xml:space="preserve" + id="text8339-1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8341);display:inline;stroke-width:1" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">1 + u + y="-354.08218" + x="831.948" + id="image8822" + xlink:href="data:image/png;base64,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 " + preserveAspectRatio="none" + height="7.6612496" + width="10.836182" />u + u_new + xml:space="preserve" + id="text2604-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.53135px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect2616);display:inline;stroke-width:1.4272" + x="311.13095" + y="248.92325" + inkscape:export-filename="/home/francesc/fig09.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">u_new + ? + style="fill:none;fill-opacity:0.21383099;stroke:#999999;stroke-width:0.40000001;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="rect7688-3-4" + width="118.46274" + height="46.709194" + x="321.42392" + y="294.53952" + inkscape:export-filename="/home/francesc/fig09.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />? + -1 + y="186.22197" + x="196.14088" + xml:space="preserve" + id="text8239-7-7" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8241-8);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/fig09.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">-1 + ? + y="186.50023" + x="207.67351" + xml:space="preserve" + id="text8283-2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8285);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/fig09.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + y="186.50023" + x="212.72137" + xml:space="preserve" + id="text8289-74" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8291);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/fig09.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + y="186.50023" + x="217.81651" + xml:space="preserve" + id="text8295-78" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8297);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/fig09.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + y="186.50023" + x="222.86902" + xml:space="preserve" + id="text8301-8" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8303);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/fig09.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + y="186.50023" + x="227.94072" + xml:space="preserve" + id="text8307-1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8309);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/fig09.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + y="186.50023" + x="232.99287" + xml:space="preserve" + id="text8313-2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8315);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/fig09.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + y="186.50023" + x="237.91754" + xml:space="preserve" + id="text8319-9" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8321);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/fig09.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + y="186.50023" + x="243.10536" + xml:space="preserve" + id="text8325-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8327);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/fig09.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + ? + y="186.50023" + x="248.32812" + xml:space="preserve" + id="text8331-5" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8333);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/fig09.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">? + 1 + y="186.22197" + x="253.394" + xml:space="preserve" + id="text8339-8" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8341);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/fig09.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">1 + -1 + y="204.55133" + x="184.18712" + xml:space="preserve" + id="text8239-7-7-2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8241-8);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/fig09.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">-1 + -1 + y="217.96948" + x="184.18712" + xml:space="preserve" + id="text8239-7-7-26" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8241-8);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/fig09.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">-1 + 1 + y="204.26785" + x="269.0463" + xml:space="preserve" + id="text8339-8-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8341);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/fig09.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">1 + 1 + y="218.15848" + x="269.0463" + xml:space="preserve" + id="text8339-8-9" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8341);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/fig09.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">1 + s + style="fill:none;stroke:#000000;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker3070-0)" + d="m 365.62464,306.1123 -10.46706,8.86416" + id="path3066-1" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/francesc/fig09.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />s + r + y="-228.54025" + x="-27.559509" + xml:space="preserve" + id="text1042-1-0-9" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect1044-2-6);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/fg10.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">r + s + y="-214.09027" + x="-11.410758" + xml:space="preserve" + id="text959-2-0-5-7-8" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect961-6-0-5-4);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/fg10.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">s + u + y="-256.38312" + x="-19.079916" + xml:space="preserve" + id="text905-3-4-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.53135px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect907-5-4);display:inline;stroke-width:1.4272" + inkscape:export-filename="/home/francesc/fg10.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">u + u_new + y="-243.37483" + x="-29.109121" + xml:space="preserve" + id="text913-7-9-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.53135px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect915-69-2);display:inline;stroke-width:1.4272" + inkscape:export-filename="/home/francesc/fg10.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">u_new + r + style="fill:none;fill-opacity:0.21383099;stroke:#999999;stroke-width:0.40000001;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="rect7688-9-7" + width="118.46274" + height="30.36175" + x="-19.879263" + y="-181.95802" + inkscape:export-filename="/home/francesc/fg10.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />r + s + inkscape:export-ydpi="200" + inkscape:export-xdpi="200" + inkscape:export-filename="/home/fverdugo/fig_jacobi_07.png" + y="-130.29074" + x="1.3041165" + height="5.1131492" + width="5.1131492" + id="rect9502" + style="fill:none;fill-opacity:0.21383099;stroke:#999999;stroke-width:0.41446099;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" />s + r + inkscape:export-ydpi="200" + inkscape:export-xdpi="200" + inkscape:export-filename="/home/fverdugo/fig_jacobi_07.png" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect1044-2-6);display:inline;stroke-width:1" + id="text9560" + xml:space="preserve" + x="-27.559509" + y="-183.56108">r + s + inkscape:export-ydpi="200" + inkscape:export-xdpi="200" + inkscape:export-filename="/home/fverdugo/fig_jacobi_07.png" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect961-6-0-5-4);display:inline;stroke-width:1" + id="text9564" + xml:space="preserve" + x="-11.410758" + y="-169.1111">s + u + inkscape:export-ydpi="200" + inkscape:export-xdpi="200" + inkscape:export-filename="/home/fverdugo/fig_jacobi_07.png" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.53135px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect907-5-4);display:inline;stroke-width:1.4272" + id="text9570" + xml:space="preserve" + x="-19.079916" + y="-211.40395">u + u_new + inkscape:export-ydpi="200" + inkscape:export-xdpi="200" + inkscape:export-filename="/home/fverdugo/fig_jacobi_07.png" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.53135px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect915-69-2);display:inline;stroke-width:1.4272" + id="text9576" + xml:space="preserve" + x="-29.109121" + y="-198.39566">u_new + r + inkscape:export-ydpi="200" + inkscape:export-xdpi="200" + inkscape:export-filename="/home/fverdugo/fig_jacobi_07.png" + y="-136.97885" + x="-19.879263" + height="30.36175" + width="118.46274" + id="rect9578" + style="fill:none;fill-opacity:0.21383099;stroke:#999999;stroke-width:0.40000001;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" />r + r-1 + y="-183.56108" + x="-45.702366" + xml:space="preserve" + id="text9590" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect1044-2-6);display:inline;stroke-width:1" + inkscape:export-filename="/home/fverdugo/fig_jacobi_07.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">r-1 + s+1 + y="-183.52547" + x="5.809339" + xml:space="preserve" + id="text9596" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect961-6-0-2);display:inline;stroke-width:1" + inkscape:export-filename="/home/fverdugo/fig_jacobi_07.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">s+1 + u + style="fill:none;fill-opacity:0.21383099;stroke:#b3b3b3;stroke-width:0.41446099;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="rect2540-4-2-5" + width="5.1131492" + height="5.1131492" + x="19.025656" + y="-76.408707" + inkscape:export-filename="/home/francesc/Downloads/fig15.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />u + u + y="-144.51996" + x="-85.648628" + xml:space="preserve" + id="text2604-9-4-9" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.53135px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect2616-6);display:inline;stroke-width:1.4272" + inkscape:export-filename="/home/francesc/Downloads/fig15.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">u + u_new + style="fill:none;fill-opacity:0.21383099;stroke:#999999;stroke-width:0.40000001;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="rect7706-6-6" + width="118.46274" + height="40.283623" + x="-86.859261" + y="-78.767036" + inkscape:export-filename="/home/francesc/Downloads/fig15.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />u_new + communication + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" + id="path6407-1-9-4" + d="m -52.344733,-55.550246 0.0727,5.46237" + style="fill:none;stroke:#000000;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6411-7-1-2)" + inkscape:export-filename="/home/francesc/Downloads/fig15.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />communication + computation + inkscape:export-ydpi="200" + inkscape:export-xdpi="200" + inkscape:export-filename="/home/francesc/Downloads/fig15.png" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.74952px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect2614-8);display:inline;fill:#4d4d4d;stroke-width:0.865991" + id="text11841" + xml:space="preserve" + x="-19.545635" + y="-103.9553">computation + u + style="fill:none;fill-opacity:0.21383099;stroke:#b3b3b3;stroke-width:0.41446099;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="rect8437-0-0" + width="5.1131492" + height="5.1131492" + x="555.86548" + y="-65.398384" + inkscape:export-filename="/home/francesc/Downloads/fig13.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />u + u_new + y="-133.50961" + x="441.36383" + xml:space="preserve" + id="text8511-6-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.53135px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8525);display:inline;stroke-width:1.4272" + inkscape:export-filename="/home/francesc/Downloads/fig13.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">u_new + i-1 + style="fill:none;stroke:#000000;stroke-width:0.26458299px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker8529-3-8)" + d="m 543.31106,-59.091456 c -4.37627,5.847601 -9.03933,7.961731 -14.49464,-0.237939" + id="path8519-2-5" + sodipodi:nodetypes="cc" + inkscape:export-filename="/home/francesc/Downloads/fig13.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" + inkscape:connector-curvature="0" />i-1 + i+1 + y="-117.79896" + x="463.11783" + xml:space="preserve" + id="text959-2-1-1-4-8-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect961-6-9-1-1);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/Downloads/fig13.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i+1 + i + y="-103.96188" + x="459.4324" + xml:space="preserve" + id="text8984-7-0" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8986);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/Downloads/fig13.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">i + i+1 + inkscape:export-ydpi="200" + inkscape:export-xdpi="200" + inkscape:export-filename="/home/francesc/Downloads/fig13.png" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect961-6-9-1-1);display:inline;stroke-width:1" + id="text12442" + xml:space="preserve" + x="476.41449" + y="-117.79896">i+1 + -1 + y="-189.16499" + x="-222.43655" + xml:space="preserve" + id="text8239-7-2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8241-8);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/Downloads/fig15.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">-1 + -1 + y="-175.16675" + x="-222.26952" + xml:space="preserve" + id="text8239-7-9" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8241-8);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/Downloads/fig15.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">-1 + -1 + y="-161.1351" + x="-222.33633" + xml:space="preserve" + id="text8239-7-74" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8241-8);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/Downloads/fig15.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">-1 + 1 + y="-189.03136" + x="-137.47003" + xml:space="preserve" + id="text8339-2" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8341);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/Downloads/fig15.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">1 + 1 + y="-175.23357" + x="-137.57027" + xml:space="preserve" + id="text8339-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8341);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/Downloads/fig15.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">1 + 1 + y="-161.03488" + x="-137.57027" + xml:space="preserve" + id="text8339-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8341);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/Downloads/fig15.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">1 + u + style="fill:none;fill-opacity:0.21383099;stroke:#b3b3b3;stroke-width:0.41446099;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="rect2540-4-2-5-0" + width="5.1131492" + height="5.1131492" + x="-249.15033" + y="-117.20872" + inkscape:export-filename="/home/francesc/Downloads/fig14.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />u + u + y="-185.31996" + x="-353.82462" + xml:space="preserve" + id="text2604-9-4-9-8" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.53135px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect2616-6);display:inline;stroke-width:1.4272" + inkscape:export-filename="/home/francesc/Downloads/fig14.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">u + u_new + style="fill:none;fill-opacity:0.21383099;stroke:#999999;stroke-width:0.40000001;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="rect7706-6-6-8" + width="118.46274" + height="40.283623" + x="-355.03525" + y="-119.56705" + inkscape:export-filename="/home/francesc/Downloads/fig14.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />u_new + communication + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" + id="path6407-1-9-4-2" + d="m -320.52072,-96.350253 0.0727,5.462369" + style="fill:none;stroke:#000000;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker6411-7-1-2-2)" + inkscape:export-filename="/home/francesc/Downloads/fig14.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />communication + computation + inkscape:export-ydpi="200" + inkscape:export-xdpi="200" + inkscape:export-filename="/home/francesc/Downloads/fig14.png" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.74952px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect2614-8);display:inline;fill:#4d4d4d;stroke-width:0.865991" + id="text11841-9" + xml:space="preserve" + x="-287.72162" + y="-144.75531">computation + -1 + y="-229.965" + x="-490.61255" + xml:space="preserve" + id="text8239-7-2-4" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8241-8);display:inline;stroke-width:1" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">-1 + -1 + y="-215.96675" + x="-490.4455" + xml:space="preserve" + id="text8239-7-9-3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8241-8);display:inline;stroke-width:1" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">-1 + -1 + y="-201.9351" + x="-490.51233" + xml:space="preserve" + id="text8239-7-74-1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8241-8);display:inline;stroke-width:1" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">-1 + 1 + y="-229.83136" + x="-405.64603" + xml:space="preserve" + id="text8339-2-0" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8341);display:inline;stroke-width:1" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">1 + 1 + y="-216.03357" + x="-405.74628" + xml:space="preserve" + id="text8339-3-1" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8341);display:inline;stroke-width:1" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">1 + 1 + y="-201.83488" + x="-405.74628" + xml:space="preserve" + id="text8339-4-6" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect8341);display:inline;stroke-width:1" + inkscape:export-filename="/home/fverdugo/fig_jacobi_08.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">1 + (i+1,j) + id="g16688" + inkscape:export-filename="/home/francesc/g16688.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">(i+1,j) + (i,j) + inkscape:export-ydpi="200" + inkscape:export-xdpi="200" + inkscape:export-filename="/home/francesc/Downloads/fig17.png" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.8454px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect961-6-9-1-1);display:inline;stroke-width:0.581229" + id="text13630" + xml:space="preserve" + x="618.40564" + y="-180.0788">(i,j) + (i-1,j) + inkscape:export-ydpi="200" + inkscape:export-xdpi="200" + inkscape:export-filename="/home/francesc/Downloads/fig17.png" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.8454px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect961-6-9-1-1);display:inline;stroke-width:0.581229" + id="text13636" + xml:space="preserve" + x="609.54858" + y="-180.0788">(i-1,j) + (i,j+1) + y="-187.43845" + x="617.04553" + xml:space="preserve" + id="text13642" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.8454px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect961-6-9-1-1);display:inline;stroke-width:0.581229" + inkscape:export-filename="/home/francesc/Downloads/fig17.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">(i,j+1) + (i,j-1) + inkscape:export-ydpi="200" + inkscape:export-xdpi="200" + inkscape:export-filename="/home/francesc/Downloads/fig17.png" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.8454px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect961-6-9-1-1);display:inline;stroke-width:0.581229" + id="text13648" + xml:space="preserve" + x="617.48566" + y="-172.66423">(i,j-1) + xxxxxxxxxxxxxxxxxxxxxxxxxxxx???????????????????????????????????? + inkscape:export-ydpi="200" + inkscape:export-xdpi="200" + inkscape:export-filename="/home/francesc/Downloads/fig17.png" + y="-171.72923" + x="593.34509" + height="5.1131492" + width="5.1131492" + id="rect845-7-7-3-2-3-5" + style="fill:none;fill-opacity:0.21383099;stroke:#000000;stroke-width:0.41446099;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" />xxxxxxxxxxxxxxxxxxxxxxxxxxxx???????????????????????????????????? + Partition2nd CPUPartition2nd CPUCPU 1CPU 2CPU PNNN/PCPU 1CPU 2CPU PNNPartition2nd CPUPartition2nd CPUCPU 1CPU 2CPU PNNN/PCPU 1CPU 2CPU PNNN/PCPU 1CPU 2CPU PCPU 1CPU 2CPU PN/PCPU 1CPU 2CPU PCPU 1CPU 2CPU PCPU 5CPU 5Data updatedData usedCPU 2CPU 2Data updatedData usedCPU 5CPU 5Data updatedData usedCPU 1CPU 1Data updatedData usedCPU 5CPU 5?Data updatedData usedu + y="-1872.7255" + x="2125.3608" + height="138.3909" + width="425.27423" + id="rect22593" />CPU 5Data updatedData usedCPU 2CPU 2Data updatedData usedCPU 5CPU 5Data updatedData usedCPU 1CPU 1Data updatedData usedCPU 5?Data updatedData usedu + u_new + inkscape:export-ydpi="200" + inkscape:export-xdpi="200" + inkscape:export-filename="/home/fverdugo/fig_jacobi_07.png" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.53135px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect915-69-2);display:inline;stroke-width:1.4272" + id="text913-7-9-1" + xml:space="preserve" + x="180.21147" + y="-397.96359">u_new + CPU 2local + inkscape:export-ydpi="200" + inkscape:export-xdpi="200" + inkscape:export-filename="/home/fverdugo/fig_jacobi_07.png" + y="-336.54681" + x="189.44133" + height="30.36175" + width="118.46274" + id="rect7688-9-8" + style="fill:none;fill-opacity:0.21383099;stroke:#999999;stroke-width:0.40000001;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" />CPU 2local + remote + y="-384.56458" + x="223.26956" + xml:space="preserve" + id="text7344" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.175px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect1044-2-1-7);display:inline;stroke-width:1" + inkscape:export-filename="/home/francesc/Downloads/fig13.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">remote + remote + style="fill:none;stroke:#000000;stroke-width:0.1384535px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5293-0)" + d="m 286.61376,-333.90381 c -2.05858,1.96638 -2.96653,0.4401 -4.44495,3.33862" + id="path5289-5" + sodipodi:nodetypes="cc" + inkscape:export-filename="/home/fverdugo/fig_jacobi_04.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" + inkscape:connector-curvature="0" />remote + 123452321911223344921531234123412935000012341234123350000InputOutput968561085232191234921531234123412935000012341234123350000InputOutput968561081234921531234123412935000012341234123350000InputOutput968561081234921531234123412935000012341234123350000InputOutput968561081234921531234123412935000012341234129350000Inputk=01234321531234123412935000012341234123350000Inputk=11234321531234123412935000012341234123350000Inputk=256561234321531234123412935000012341234123350000Inputk=356561088101234321531234123412935000012341234123350000Inputk=456561088109689681k2i34921531j2341234C[i,j]1C[i,k]2C[k,j]9C[i,j] = min(C[i,j],C[i,k]+C[k,j])k -i -j -3C[i,j] = min(C[i,j],C[i,k]+C[k,j])CPU 2ijkkCPU 2ijkk5CPU 2000012341234123350000InputkOutput96856108CPU 2CPU 2Data updatedData used (iteration k)kCPU 2?Data updatedData used (iteration k)CPU 2CPU 2N/PN1P1P2P3123456time1P1P2P32123456time34921531234123412935000012341234123350000Input1243433423234224223141113333444612434334232342242231411133334446612434332323223141422411333434446124343323232231414224113334344467912434332323223141422411333434446667791243433232322314142241133343444679Output9685610812341234123412340000Table CGraph G -Output32232413232413Start =1112324Length = 663124343342323422422314111333344412341234321243433423234224223141113333444123412341234123412341234123410101010101055555xxxx12443342332... -... -... -... -... -... -Master -Workers -maxhops -?Data updatedData used (iteration k)kkData updatedkkData updatedkkData updatedkkData updatedkkData updatedkData updatedkkData updatedkkkusing a 12x12 matrixmyrows4kkCPU 1Data updated (iteration k)?kkCPU 3kkCPU 3Data updated (iteration k)Data used (iteration k)kkCPU 3kkCPU 3Data updated (iteration k)Data used (iteration k)?1D block2D block2D cyclic1D block1D cyclickkkkData updated (iteration k)Data updated (iteration k)CPU 1CPU 4??kkkkData updated (iteration k)Data updated (iteration k)CPU 1CPU 4CPU 1CPU 1CPU 4CPU 4kkCPU 3Data updated (iteration k)?kkCPU 3Data used (iteration k)?kkCPU 1Data updated (iteration k)?kkCPU 1Data used (iteration k)9?CPU 2Data updatedData used?CPU 5Data updatedData used?CPU 1Data updatedData used?u -u_new -CPU 2???CPU 2CPU 1CPU 31243433423234224223141113333444W1W2W3W4W5W61243433423234224223141113333444W1W2W3215312341234129350000123412341293500001243433423234224Input2231411133334441243433423234224223141113333444W1W2W36679771243433423234224223141113333444W1W2W3rank 0 -rank 1 -rank 2 -root -rand(1:10) -kk=01kCPU 323Data updated (iteration k=6)?CPU 24321531234123412935000012341234CPU 1123350000Inputk=11234?321531234123412935000012341234123350000Inputk=256561234321531234123412935000012341234123350000Inputk=356561088101234321531234123412935000012341234123350000Inputk=45656108810968968kijC[i,j]C[i,k]C[k,j]C[i,j] = min(C[i,j],C[i,k]+C[k,j])k + +i + +j + +C[i,j] = min(C[i,j],C[i,k]+C[k,j])CPU 2ijkkCPU 2ijkkCPU 2kCPU 2CPU 2Data updatedData used (iteration k)kCPU 2?Data updatedData used (iteration k)CPU 2CPU 2N/PN1P1P2P3123456time?P1P2P3123456time12434334232342242231411133334446124343342323422422314111333344466124343323232231414224CPU 3CPU 2CPU 1113334344461k2k4CPU 33Data updated (iteration k=6)CPU 243323232231414224CPU 11Data updated (iteration k=6)1333k434446791243433232322314142kCPU 12CPU 2CPU 3CPU 4411333434446667791243433232322314142Data updated (iteration k=6)24113334344467912341234123412340000Table CGraph G + +Output32232413232413Start =11234Length = 661k2kCPU 1CPU 2CPU 3CPU 4Data updated (iteration k=6)4k34kCPU 1CPU 1CPU 1CPU 2CPU 2CPU 2CPU 3CPU 3CPU 3CPU 4CPU 4CPU 4Data updated (iteration k=6)3k342k3CPU 1CPU 12CPU 1CPU 23CPU 2CPU 24CPU 3CPU 32CPU 3CPU 42CPU 4CPU 4kk4k2kData updated (iteration k)Data used (iteration k)2k3i141113333444i12341234321243433423234224223141113333444123412341234123412341234123410101010101055555xxxx12443342332... + +... + +... + +... + +... + +... + +Master + +Workers + +maxhops + +?Data updatedData used (iteration k)kkData updatedkkData updatedkkData updatedkkData updatedkkData updatedkData updatedkkData updatedkkkusing a 12x12 matrixmyrowskkCPU 1Data updated (iteration k)?kkCPU 3kkCPU 3Data updated (iteration k)Data used (iteration k)kkCPU 3kkCPU 3Data updated (iteration k)Data used (iteration k)?1D block2D block2D cyclic1D block1D cyclickkkkData updated (iteration k)Data updated (iteration k)CPU 1CPU 4??kkkkData updated (iteration k)Data updated (iteration k)CPU 1CPU 4CPU 1CPU 1CPU 4CPU 4kkCPU 3Data updated (iteration k)?kkkkkkCPU 3Data updated (iteration k)Data used (iteration k)Data used (iteration k)kii?u -u_new -?kkCPU 1Data updated (iteration k)?kkCPU 1Data used (iteration k)?CPU 2Data updatedData usedCPU 2local -remote -?remote -local + id="path22057-6" + d="m 1240.7046,-318.87749 v 46.01836" + style="fill:#0000ff;stroke:#0000ff;stroke-width:0.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />CPU 5Data updatedData used?CPU 1Data updatedData used?u + u_new + +CPU 2???CPU 2CPU 1CPU 31remote -Output243433423234224223141113333444W1W2W3W4W5W61243433423234224223141113333444W1W2W312434334232342242231411133334441124343342323422422314111333344424Output3min distance = 64Output3min distance = 63423234224629273917481Distance matrix C + id="flowRoot19219" + style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none" + transform="matrix(0.11784839,0,0,0.11784839,248.0672,566.96476)">113333444W1W2W36679771243433423234224223141113333444W1W2W3rank 0 + +rank 1 + +rank 2 + i+1 + d="m 1745.1424,229.78745 0.4487,2.50959 -1.9676,-1.62095 c 0.6414,0.0676 1.2538,-0.29319 1.5189,-0.88864 z" + style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:0.136875;stroke-linejoin:round;stroke-opacity:1" + id="path13285-7" + inkscape:connector-curvature="0" />root + i-1 -i -u -u_new + xml:space="preserve" + id="text1605" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.9375px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect1130-2);display:inline;fill:#0000ff;stroke-width:1.87008" + x="1745.4172" + y="148.26538">rand(1:10) + i+1 + style="fill:none;fill-opacity:0.85238091;stroke:#000000;stroke-width:0.114;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.96666715" + id="rect15452-1" + width="5.1131492" + height="5.1131492" + x="2096.895" + y="457.78888" + inkscape:export-filename="/home/francesc/fig_jacobi_07.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />kkCPU 3Data updated (iteration k=6)?CPU 2CPU 1??CPU 3CPU 2CPU 1kkCPU 3Data updated (iteration k=6)CPU 2CPU 1Data updated (iteration k=6)kkCPU 1CPU 2CPU 3CPU 4Data updated (iteration k=6)kkCPU 1CPU 2CPU 3CPU 4Data updated (iteration k=6)kkCPU 1CPU 1CPU 1CPU 2CPU 2CPU 2CPU 3CPU 3CPU 3CPU 4CPU 4CPU 4Data updated (iteration k=6)kkCPU 1CPU 1CPU 1CPU 2CPU 2CPU 2CPU 3CPU 3CPU 3CPU 4CPU 4CPU 4kkkkData updated (iteration k)Data used (iteration k)kiikkkkData updated (iteration k)Data used (iteration k)kii?u + i-1 -i -u -u_new + y="-511.35645" + x="461.42575" + xml:space="preserve" + id="text913-7-9-1-0" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.53135px;line-height:1.25;font-family:Hack;-inkscape-font-specification:Hack;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect915-69-2);display:inline;stroke-width:1.4272" + inkscape:export-filename="/home/fverdugo/fig_jacobi_07.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200">u_new + \ No newline at end of file + style="fill:none;fill-opacity:0.21383099;stroke:#999999;stroke-width:0.40000001;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + id="rect7688-9-8-7" + width="118.46274" + height="30.36175" + x="470.65561" + y="-449.93967" + inkscape:export-filename="/home/fverdugo/fig_jacobi_07.png" + inkscape:export-xdpi="200" + inkscape:export-ydpi="200" />CPU 2local + +remote + +remote + +local + +remote + +Output1243433423234224223141113333444Outputmin distance = 6Outputmin distance = 6697978Distance matrix C + +i+1 + +i-1 + +i + +u + +u_new + +i+1 + +i-1 + +i + +u + +u_new + +u +u_new +-1 +-1 +1 +1 +-1 +1 +? +? +? +? +? +? +? +? +? +? + \ No newline at end of file diff --git a/notebooks/jacobi_method.ipynb b/notebooks/jacobi_method.ipynb index 08c01da..31d421f 100644 --- a/notebooks/jacobi_method.ipynb +++ b/notebooks/jacobi_method.ipynb @@ -45,10 +45,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 104, "id": "1dc78750", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🥳 Well done! \n" + ] + } + ], "source": [ "using Printf\n", "\n", @@ -63,6 +71,24 @@ "jacobi_1_check(answer) = answer_checker(answer, \"d\")\n", "jacobi_2_check(answer) = answer_checker(answer, \"b\")\n", "jacobi_3_check(answer) = answer_checker(answer, \"c\")\n", + "sndrcv_check(answer) = answer_checker(answer,\"b\")\n", + "function sndrcv_fix_answer()\n", + " msg = \"\"\"\n", + " One needs to carefully order the sends and the receives to avoid cyclic dependencies\n", + " that might result in deadlocks. The actual implementation is left as an exercise. \n", + " \"\"\"\n", + " println(msg)\n", + "end\n", + "jacobitest_check(answer) = answer_checker(answer,\"a\")\n", + "function jacobitest_why()\n", + " msg = \"\"\"\n", + " The test will pass. The parallel implementation does exactly the same operations\n", + " in exactly the same order than the sequential one. Thus, the result should be\n", + " exactly the same. Note however this is often not true in other parallel algorithms.\n", + " Specially, when one does parallel reductions.\n", + " \"\"\"\n", + " println(msg)\n", + "end\n", "println(\"🥳 Well done! \")" ] }, @@ -526,45 +552,73 @@ "source": [ "## MPI implementation\n", "\n", - "We consider the implementation using MPI. The programming model of MPI is generally better suited for data-parallel algorithms like this one than the task-based model provided by Distributed.jl. In any case, one can also implement it using Distributed.jl, but it requires some extra effort to setup the remote channels right for the communication between neighbor processes.\n", - " \n", - "Take a look at the implementation below and try to understand it.\n" + "We consider the implementation of the Jacobi method using MPI. The programming model of MPI is generally better suited for data-parallel algorithms like this one than the task-based model provided by Distributed.jl. In any case, one can also implement it using Distributed.jl, but it requires some extra effort to setup the remote channels right for the communication between neighbor processes.\n", + "\n", + "We are going to implement the method in a function with the following signature\n", + "\n", + "```julia\n", + " u = jacobi_mpi(n,niters,comm)\n", + "```\n", + "\n", + "The signature will be very similar to the sequential function `jacobi`, but there are some important differences:\n", + "\n", + "1. The parallel one takes an MPI communicator object. This allows the user to decide which communicator to use. For instance, `MPI.COMM_WORLD` directly or a duplicate of this one (which is the recommended approach).\n", + "2. Function `jacobi_mpi` will be called on multiple MPI ranks. Thus, the values of `n` and `niters` should be the same in all ranks. The caller of this function has to make sure that this is true. Otherwise, the parallel code will not work.\n", + "3. The result `u` is NOT the same as the result of the sequential function `jacobi`. It will contained only the local portion of `u` stored at each rank. To recover the same vector as in the sequential case, one needs to gather these pieces in a single rank. We will do this later.\n", + "\n", + "The implementation of the parallel function is given in the following code snipped:" ] }, { "cell_type": "code", - "execution_count": null, - "id": "e15082fb", + "execution_count": 53, + "id": "77088426", "metadata": {}, "outputs": [], "source": [ - "] add MPI" + "code1 = quote\n", + " function jacobi_mpi(n,niters,comm)\n", + " # Initialization\n", + " u, u_new = init(n,comm)\n", + " for t in 1:niters\n", + " # Communication\n", + " ghost_exchange!(u,comm)\n", + " # Local computation\n", + " local_update!(u,u_new)\n", + " u, u_new = u_new, u\n", + " end\n", + " return u\n", + " end\n", + "end;" + ] + }, + { + "cell_type": "markdown", + "id": "cae5af50", + "metadata": {}, + "source": [ + "In the following cells, we discuss the implementation of the helper functions `init`, `ghost_exchange`, and `local_update`." + ] + }, + { + "cell_type": "markdown", + "id": "5da3e049", + "metadata": {}, + "source": [ + "### Initialization\n", + "\n", + "Let us start with function `init`. This is its implementation:" ] }, { "cell_type": "code", - "execution_count": null, - "id": "a66cbf9a", + "execution_count": 52, + "id": "ee17f3cb", "metadata": {}, "outputs": [], "source": [ - "using MPI" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d39c7bb2", - "metadata": { - "code_folding": [] - }, - "outputs": [], - "source": [ - "code = quote\n", - " using MPI\n", - " MPI.Init()\n", - " function jacobi_mpi(n,niters)\n", - " comm = MPI.COMM_WORLD\n", + "code2 = quote\n", + " function init(n,comm)\n", " nranks = MPI.Comm_size(comm)\n", " rank = MPI.Comm_rank(comm)\n", " if mod(n,nranks) != 0\n", @@ -573,53 +627,409 @@ " end\n", " load = div(n,nranks)\n", " u = zeros(load+2)\n", - " u[1] = -1\n", - " u[end] = 1\n", - " u_new = copy(u)\n", - " for t in 1:niters\n", - " # Communication\n", - " if rank != 0\n", - " neig_rank = rank-1\n", - " s = 2\n", - " r = 1\n", - " MPI.Sendrecv!(view(u,s:s),view(u,r:r),comm;dest=neig_rank,source=neig_rank)\n", - " end\n", - " if rank != (nranks-1)\n", - " neig_rank = rank+1\n", - " s = load+1\n", - " r = load+2\n", - " MPI.Sendrecv!(view(u,s:s),view(u,r:r),comm;dest=neig_rank,source=neig_rank)\n", - " end\n", - " # Local computation\n", - " for i in 2:(load+1)\n", - " u_new[i] = 0.5*(u[i-1]+u[i+1])\n", - " end\n", - " u, u_new = u_new, u\n", + " if rank == 0\n", + " u[1] = -1\n", " end\n", - " # Gather the results\n", + " if rank == nranks-1\n", + " u[end] = 1\n", + " end\n", + " u_new = copy(u)\n", + " u, u_new\n", + " end\n", + "end;" + ] + }, + { + "cell_type": "markdown", + "id": "dee2b3b9", + "metadata": {}, + "source": [ + "This function crates and initializes the vector `u` and the auxiliary vector `u_new` and fills in the boundary values. Note that we are not creating the full arrays like in the sequential case. We are only creating the parts to be managed by the current rank. To this end, we start by computing the number of entries to be updated in this rank, i.e., variable `load`. We have assumed that `n` is a multiple of the number of ranks for simplicity. If this is not the case, we stop the computation with `MPI.Abort`. Note that we are allocating two extra elements in `u` (and `u_new`) for the ghost cells or boundary conditions. The following figure displays the arrays created for `n==9` and `nranks==3` (thus `load == 3`). Note that the first and last elements of the arrays are displayed with gray edges denoting that they are the extra elements allocated for ghost cells or boundary conditions." + ] + }, + { + "attachments": { + "fig.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "5885e6e7", + "metadata": {}, + "source": [ + "
\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "0efe5f7a", + "metadata": {}, + "source": [ + "### Communication\n", + "\n", + "Once the working arrays have been created, we can start with the iterations of the Jacobi method. Remember that this is implemented in parallel by updating the ghost cells with data from neighboring processes and then performing the sequential Jacobi update. See figure:" + ] + }, + { + "attachments": { + "fig15.png": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6gAAAFACAYAAACxyVHuAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAewgAAHsIBbtB1PgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7N15fFT19f/x12cmIQFkE1wANxBFrTu4b1itimQC2mKrtfrtRtXazbbWrmJba+1m7S5fv9Wqrbb5VWBugFatpe4buGvdFVcU2cISSOZ+fn+cO2QyTCAsmXszeT8fj/vIvXPv3Dm5M3PnnvvZ3DXXXOMRERERERERiVkq7gBEREREREREQAmqiIiIiIiIJERV0fLJzrlX4whEREREREREehbv/W7AP/PL7RJU59yrU6ZMeb7cQYmIiIiIiEjPM23aNLxv6xZJVXxFREREREQkEZSgioiIiIiISCIoQRUREREREZFEUIIqIiIiIiIiiaAEVURERERERBJBCaqIiIiIiIgkghJUERERERERSQQlqCIiIiIiIpIISlBFREREREQkEZSgioiIiIiISCIoQRUREREREZFEUIIqIiIiIiIiiaAEVURERERERBKhKu4ARDbGe+8aGxsvizuODbnuuusOWLhw4SCAhQsXvvbiiy++EndMRXYBRkbzy4H5McZSSn/g4ILlu4FcTLGUdPjhhx+dTqerAE455ZSnDjzwwEVxx9QR59yDdXV1s8rxWtls9nPOueHleK3NMXv27BFPPPHErgArV65c8thjjz0ed0xFBgEHFCzPjSmODRlXMP84sCSmODpyAHYcARYAL8cYy3pGjBixy7Bhw0YCbLvttsunTJmStPNvO+l0+vJTTz11TVe/ThAEewFndfXrbK7m5ub0L3/5y2Pyy88+++z8xYsXL48zphIOxn4/wT73C2KMpZQRwK7R/FLgsRhjWc/gwYMH7rXXXgfmly+55JK5MYazUWEY3jBx4sQX446jHJSgSuJddtllbsyYMd+NO44NeeGFF3jyySfzi8dsaNuEmBB3ABuRuGP4wAMPrJsfN25c4uIr5L3/LVCWBBX4DDC2TK+1yd577z3uvffewofq44qlkxL92SL58SXOK6+8wiuv2D3LUaNGQcLPv9XV1T8HujxB9d6Pds4l+re96NyR9M9+0uMDyMQdQKH333+/3XschuExqVRyK5em0+l7gR6RoCb3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" + } + }, + "cell_type": "markdown", + "id": "f7045b08", + "metadata": {}, + "source": [ + "
\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "e340cfd0", + "metadata": {}, + "source": [ + "The communication step happens in function `ghost_exchange!`. This one modifies the ghost cells in the input vector `u` by importing data using MPI point-to-point communication. See the following code:" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "f3221768", + "metadata": {}, + "outputs": [], + "source": [ + "code3 = quote\n", + " function ghost_exchange!(u,comm)\n", + " load = length(u)-2\n", + " rank = MPI.Comm_rank(comm)\n", + " nranks = MPI.Comm_size(comm)\n", + " if rank != 0\n", + " neig_rank = rank-1\n", + " u_snd = view(u,2:2)\n", + " u_rcv = view(u,1:1)\n", + " dest = neig_rank\n", + " source = neig_rank\n", + " MPI.Sendrecv!(u_snd,u_rcv,comm;dest,source)\n", + " end\n", + " if rank != (nranks-1)\n", + " neig_rank = rank+1\n", + " u_snd = view(u,(load+1):(load+1))\n", + " u_rcv = view(u,(load+2):(load+2))\n", + " dest = neig_rank\n", + " source = neig_rank\n", + " MPI.Sendrecv!(u_snd,u_rcv,comm;dest,source)\n", + " end\n", + " end\n", + "end;" + ] + }, + { + "cell_type": "markdown", + "id": "8948edc4", + "metadata": {}, + "source": [ + "Note that we have used `MPI.Sendrecv!` to send and receive values." + ] + }, + { + "cell_type": "markdown", + "id": "186254b6", + "metadata": {}, + "source": [ + "
\n", + "Question: Is this other implementation based on `MPI.Send` and `MPI.Recv!` correct?\n", + "
\n", + "\n", + "```julia\n", + " function ghost_exchange!(u,comm)\n", + " load = length(u)-2\n", + " rank = MPI.Comm_rank(comm)\n", + " nranks = MPI.Comm_size(comm)\n", + " if rank != 0\n", + " neig_rank = rank-1\n", + " u_snd = view(u,2:2)\n", + " u_rcv = view(u,1:1)\n", + " dest = neig_rank\n", + " source = neig_rank\n", + " MPI.Send(u_snd,comm;dest)\n", + " MPI.Recv!(u_rcv,comm;source)\n", + " end\n", + " if rank != (nranks-1)\n", + " neig_rank = rank+1\n", + " u_snd = view(u,(load+1):(load+1))\n", + " u_rcv = view(u,(load+2):(load+2))\n", + " dest = neig_rank\n", + " source = neig_rank\n", + " MPI.Send(u_snd,comm;dest)\n", + " MPI.Recv!(u_rcv,comm;source)\n", + " end\n", + " end\n", + "```\n", + "\n", + " a) It is correct.\n", + " c) It is incorrect, but it might provide the right result depending on the MPI implementation.\n", + " b) It is incorrect, and it is guaranteed that it will result in a dead lock.\n", + " d) This implementation does not work when distributing over just a single MPI rank.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "77e94001", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "It's not correct. Keep trying! 💪\n" + ] + } + ], + "source": [ + "answer = \"x\" # replace x with a, b, c or d\n", + "sndrcv_check(answer)" + ] + }, + { + "cell_type": "markdown", + "id": "fd3f87e4", + "metadata": {}, + "source": [ + "
\n", + "Question: How would you fix the implementation above, while still using `MPI.Send` and `MPI.Recv!` instead of `MPI.Sendrecv!` ?\n", + "
\n", + "\n", + "Think about the answer. To uncover the the solution run next cell." + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "16a76ea1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "One needs to carefully order the sends and the receives to avoid cyclic dependencies\n", + "that might result in deadlocks. The actual implementation is left as an exercise. \n", + "\n" + ] + } + ], + "source": [ + "sndrcv_fix_answer()" + ] + }, + { + "cell_type": "markdown", + "id": "0bc9ed9d", + "metadata": {}, + "source": [ + "### Local computation\n", + "\n", + "Once the ghost values have the right values, we can perform the Jacobi update locally at each process. This is done in function `local_update!`. Note that here we only update the data *owned* by the current MPI rank, i.e. we do not modify the ghost values. There is no need to modify the ghost values since they will updated by another rank, i.e. the rank that own the value. In the code this is reflected in the loop over `i`. We do not visit the first nor the last entry in `u_new`." + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "cfce8c20", + "metadata": {}, + "outputs": [], + "source": [ + "code4 = quote\n", + " function local_update!(u,u_new)\n", + " load = length(u)-2\n", + " for i in 2:(load+1)\n", + " u_new[i] = 0.5*(u[i-1]+u[i+1])\n", + " end\n", + " end\n", + "end;" + ] + }, + { + "cell_type": "markdown", + "id": "ffc1b539", + "metadata": {}, + "source": [ + "### Running the code\n", + "\n", + "Not let us put all pieces together and run the code. If not done yet, install MPI." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "d990bd1c", + "metadata": {}, + "outputs": [], + "source": [ + "] add MPI" + ] + }, + { + "cell_type": "markdown", + "id": "9ac0d914", + "metadata": {}, + "source": [ + "The following cells includes all previous code snippets into a final one. Note that we are eventually calling function `jacobi_mpi` and showing the result vector `u`. Run the following code for 1 MPI rank, then for 2 and 3 MPI ranks. Look into the values of `u`. Does it make sense?" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "id": "0926b746", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "u = [-1.0, -0.7999999999999999, -0.5999999999999999, -0.3999999999999999, -0.19999999999999996, 0.0, 0.19999999999999996, 0.3999999999999999, 0.5999999999999999, 0.7999999999999999, 1.0]\n" + ] + } + ], + "source": [ + "using MPI\n", + "code = quote\n", + " using MPI\n", + " MPI.Init()\n", + " $code1\n", + " $code2\n", + " $code3\n", + " $code4\n", + " n = 9\n", + " niters = 200\n", + " comm = MPI.Comm_dup(MPI.COMM_WORLD)\n", + " u = jacobi_mpi(n,niters,comm)\n", + " @show u\n", + "end\n", + "run(`$(mpiexec()) -np 1 julia --project=. -e $code`);" + ] + }, + { + "cell_type": "markdown", + "id": "d5d5bb40", + "metadata": {}, + "source": [ + "### Checking the result\n", + "\n", + "Checking the result visually is not enough in general. To check the parallel implementation we want to compare the result against the sequential implementation. The way we do the computations (either in parallel or sequential) should not affect the result. However, how can we compare the sequential and the parallel result? The parallel version gives a distributed vector. We cannot compare this one directly with the result of the sequential function. A possible solution is to gather all the pieces of the parallel result in a single rank and compare there against the parallel implementation.\n", + "\n", + "\n", + "The following function gather the distributed vector in rank 0." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "ec9dcdec", + "metadata": {}, + "outputs": [], + "source": [ + "code5 = quote\n", + " function gather_final_result(u,comm)\n", + " load = length(u)-2\n", + " rank = MPI.Comm_rank(comm)\n", " if rank !=0\n", - " lb = 2\n", - " ub = load+1\n", - " MPI.Send(view(u,lb:ub),comm,dest=0)\n", - " u_all = zeros(0) # This will nevel be used\n", + " # If I am not rank 0\n", + " # I send my own data to rank 0\n", + " u_snd = view(u,2:(load+1))\n", + " MPI.Send(u_snd,comm,dest=0)\n", + " u_root = zeros(0) # This will nevel be used\n", " else\n", - " u_all = zeros(n+2)\n", + " # If I am rank 0\n", + " nranks = MPI.Comm_size(comm)\n", + " n = load*nranks\n", + " u_root = zeros(n+2)\n", " # Set boundary\n", - " u_all[1] = -1\n", - " u_all[end] = 1\n", + " u_root[1] = -1\n", + " u_root[end] = 1\n", " # Set data for rank 0\n", " lb = 2\n", " ub = load+1\n", - " u_all[lb:ub] = view(u,lb:ub)\n", - " # Set data for other ranks\n", + " u_root[lb:ub] = view(u,lb:ub)\n", + " # Receive and set data from other ranks\n", " for other_rank in 1:(nranks-1)\n", " lb += load\n", " ub += load\n", - " MPI.Recv!(view(u_all,lb:ub),comm;source=other_rank)\n", + " u_rcv = view(u_root,lb:ub)\n", + " MPI.Recv!(u_rcv,comm;source=other_rank)\n", " end\n", " end\n", - " return u_all\n", + " # NB onle the root (rank 0) will\n", + " # contain meaningfull data\n", + " return u_root\n", " end\n", + "end;" + ] + }, + { + "cell_type": "markdown", + "id": "93fb1bd6", + "metadata": {}, + "source": [ + "Run the following cell to see the result. Is the result as expected?" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "id": "8e173a5f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "u_root = [-1.0, -0.7999999999999999, -0.5999999999999999, -0.3999999999999999, -0.19999999999999996, 0.0, 0.19999999999999996, 0.3999999999999999, 0.5999999999999999, 0.7999999999999999, 1.0]\n", + "u_root = Float64[]\n", + "u_root = Float64[]\n" + ] + } + ], + "source": [ + "code = quote\n", + " using MPI\n", + " MPI.Init()\n", + " $code1\n", + " $code2\n", + " $code3\n", + " $code4\n", + " $code5\n", + " n = 9\n", + " niters = 200\n", + " comm = MPI.Comm_dup(MPI.COMM_WORLD)\n", + " u = jacobi_mpi(n,niters,comm)\n", + " u_root = gather_final_result(u,comm)\n", + " @show u_root\n", + "end\n", + "run(`$(mpiexec()) -np 3 julia --project=. -e $code`);" + ] + }, + { + "cell_type": "markdown", + "id": "d0edbad5", + "metadata": {}, + "source": [ + "Now that we have collected the parallel vector into a single array, we can compare it against the sequential implementation. This is done in the following cells." + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "id": "6abd3a76", + "metadata": {}, + "outputs": [], + "source": [ + "code6 = quote\n", " function jacobi(n,niters)\n", " u = zeros(n+2)\n", " u[1] = -1\n", @@ -633,53 +1043,122 @@ " end\n", " u\n", " end\n", - " function testit(load)\n", - " comm = MPI.COMM_WORLD\n", - " nranks = MPI.Comm_size(comm)\n", - " rank = MPI.Comm_rank(comm)\n", - " n = load*nranks\n", - " niters = 100\n", - " u_par = jacobi_mpi(n,niters)\n", - " if rank == 0\n", - " # Compare agains serial\n", - " u_seq = jacobi(n,niters)\n", - " if u_par ≈ u_seq\n", - " println(\"Test passed 🥳\")\n", - " else\n", - " println(\"Test failed\")\n", - " end\n", - " end\n", - " end\n", - " testit(3)\n", - "end\n", - "run(`$(mpiexec()) -np 4 julia --project=. -e $code`);" - ] - }, - { - "cell_type": "markdown", - "id": "eff25246", - "metadata": {}, - "source": [ - "
\n", - "Question: In function jacobi_mpi, how many messages per iteration are sent from a process away from the boundary (excluding the messages to collect the data on rank 0)?\n", - "
\n", - "\n", - " a) 1\n", - " b) 2\n", - " c) 3\n", - " d) 4\n", - "\n" + "end;" ] }, { "cell_type": "code", - "execution_count": null, - "id": "98bd9b5e", + "execution_count": 102, + "id": "58c2f44e", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test passed 🥳\n" + ] + } + ], + "source": [ + "code = quote\n", + " using MPI\n", + " MPI.Init()\n", + " $code1\n", + " $code2\n", + " $code3\n", + " $code4\n", + " $code5\n", + " $code6\n", + " n = 12\n", + " niters = 100\n", + " comm = MPI.Comm_dup(MPI.COMM_WORLD)\n", + " u = jacobi_mpi(n,niters,comm)\n", + " u_root = gather_final_result(u,comm)\n", + " rank = MPI.Comm_rank(comm)\n", + " if rank == 0\n", + " # Compare agains serial\n", + " u_seq = jacobi(n,niters)\n", + " if isapprox(u_root,u_seq)\n", + " println(\"Test passed 🥳\")\n", + " else\n", + " println(\"Test failed\")\n", + " end\n", + " end\n", + "end\n", + "run(`$(mpiexec()) -np 3 julia --project=. -e $code`);" + ] + }, + { + "cell_type": "markdown", + "id": "1bd7a876", + "metadata": {}, + "source": [ + "Note that we have used function `isapprox` to compare the results. This function checks if two values are the same within machine precision. Using `==` is generally discouraged when working with floating point numbers as they can be affected by rounding-off errors." + ] + }, + { + "cell_type": "markdown", + "id": "a6602ada", + "metadata": {}, + "source": [ + "
\n", + "Question: What happens if we use `u_root == u_seq` to compare the parallel and the sequential result?\n", + "
\n", + "\n", + " a) The test will still pass.\n", + " c) The test will fail due to rounding-off errors.\n", + " b) The test might pass or fail depending on `n`.\n", + " d) The test might pass or fail depending on the number of MPI ranks." + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "id": "6b1c9f68", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "It's not correct. Keep trying! 💪\n" + ] + } + ], "source": [ "answer = \"x\" # replace x with a, b, c or d\n", - "jacobi_2_check(answer)" + "jacobitest_check(answer)" + ] + }, + { + "cell_type": "markdown", + "id": "0825df69", + "metadata": {}, + "source": [ + "Run cell below for an explanation of the correct answer." + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "id": "7a1a1342", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The test will pass. The parallel implementation does exactly the same operations\n", + "in exactly the same order than the sequential one. Thus, the result should be\n", + "exactly the same. Note however this is often not true in other parallel algorithms.\n", + "Specially, when one does parallel reductions.\n", + "\n" + ] + } + ], + "source": [ + "jacobitest_why()" ] }, { @@ -687,7 +1166,7 @@ "id": "c9aa2901", "metadata": {}, "source": [ - "### Latency hiding\n", + "## Latency hiding\n", "\n", "Can our implementation above be improved? Note that we only need communications to update the values at the boundary of the portion owned by each process. The other values (the one in green in the figure below) can be updated without communications. This provides the opportunity of overlapping the computation of the interior values (green cells in the figure) with the communication of the ghost values. This technique is called latency hiding, since we are hiding communication latency by overlapping it with computation that we need to do anyway.\n", "\n",