<p>Remember that the code has a different B on every process. You can use a viewer on COMM_SELF, but you should send it to different files so the output isn&#39;t all mixed together.</p>
<div class="gmail_quote">On Sep 1, 2011 1:33 PM, &quot;Likun Tan&quot; &lt;<a href="mailto:likunt@andrew.cmu.edu">likunt@andrew.cmu.edu</a>&gt; wrote:<br type="attribution">&gt; Thank you very much.<br>&gt; <br>&gt; With the command:<br>
&gt; for(j=0; j&lt;n; j++)<br>&gt; {<br>&gt;     for(i=0; i&lt;M; i++)<br>&gt;     {<br>&gt;          MatSetValues(B, 1, &amp;i, 1, &amp;j, &amp;Value, INSERT_VALUES);<br>&gt;     }<br>&gt; }<br>&gt; This only defines the columns from 0 to n-1? How exactly MPI_Scan()<br>
&gt; getting used here?<br>&gt; <br>&gt; And when i try to print out the result with<br>&gt; <br>&gt; PetscViewer  viewer;<br>&gt; PetscViewerSetFormat(viewer, PETSC_VIEWER_ASCII_MATLAB);<br>&gt; MatView(B, viewer);<br>&gt; <br>
&gt; I can only see the columns from 0 to n-1. Maybe there is still problem in<br>&gt; computing B.<br>&gt; <br>&gt; Many thanks,<br>&gt; Likun<br>&gt; <br>&gt; On Thu, September 1, 2011 1:54 pm, Jed Brown wrote:<br>&gt;&gt; On Thu, Sep 1, 2011 at 12:45, Likun Tan &lt;<a href="mailto:likunt@andrew.cmu.edu">likunt@andrew.cmu.edu</a>&gt; wrote:<br>
&gt;&gt;<br>&gt;&gt;<br>&gt;&gt;&gt; I still have some confusions. When computing B before MPI_Scan(), could<br>&gt;&gt;&gt; i compute the values in parallel? After using MPI_Scan(), does that mean<br>&gt;&gt;&gt; the columns of B will be gathered in one processor?<br>
&gt;&gt;&gt;<br>&gt;&gt;<br>&gt;&gt; No, the scan is just computing the start column for a given process.<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; Here are main steps i took based on your suggestion,<br>
&gt;&gt;&gt;<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; PetscSplitOwnership(PETSC_COMM_WORLD, &amp;n, &amp;N);<br>&gt;&gt;&gt;<br>&gt;&gt;&gt;<br>&gt;&gt;<br>&gt;&gt; Add these two lines here:<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt; MPI_Scan(&amp;n, &amp;cstart, 1, MPIU_INT, MPI_SUM, PETSC_COMM_WORLD);<br>
&gt;&gt; cstart -= n;<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt;&gt; MatCreateSeqDense(PETSC_COMM_SELF, M, n, PETSC_NULL, &amp;B);<br>&gt;&gt;&gt; MatCreateSeqDense(PETSC_COMM_SELF, M, M, PETSC_NULL, &amp;A);<br>&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>&gt;&gt;<br>&gt;&gt; Good<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt;&gt; MatCreateSeqDense(PETSC_COMM_SELF, M, N, PETSC_NULL, &amp;x);<br>&gt;&gt;&gt;<br>&gt;&gt;&gt;<br>&gt;&gt;<br>&gt;&gt; Replace with<br>
&gt;&gt;<br>&gt;&gt;<br>&gt;&gt; MatDuplicate(B,MAT_DO_NOT_COPY_VALUES,&amp;x);<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt;&gt; for(j=0; j&lt;N; j++)<br>&gt;&gt;&gt;<br>&gt;&gt;<br>&gt;&gt; change the loop bounds here:<br>
&gt;&gt;<br>&gt;&gt; for(j=0; j&lt;n; j++)<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt;&gt; {<br>&gt;&gt;&gt; for(i=0; i&lt;M; i++) {<br>&gt;&gt;&gt;<br>&gt;&gt;&gt;<br>&gt;&gt;<br>&gt;&gt; Good, now compute value as the value that goes in (i,cstart+j).<br>
&gt;&gt;<br>&gt;&gt;<br>&gt;&gt; MatSetValues(B, 1, &amp;i, 1, &amp;j, &amp;value, INSERT_VALUES);<br>&gt;&gt;<br>&gt;&gt;&gt; }<br>&gt;&gt;&gt; }<br>&gt;&gt;&gt; MatAssemblyBegin(...);<br>&gt;&gt;&gt; MatAssemblyEnd(...)<br>
&gt;&gt;&gt;<br>&gt;&gt;&gt;<br>&gt;&gt;<br>&gt;&gt; This part is correct.<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt;&gt; MPI_Scan(&amp;n, &amp;cstart, 1, MPIU_INT, MPI_SUM, PETSC_COMM_WORLD);<br>&gt;&gt;&gt; cstart -= n;<br>
&gt;&gt;&gt;<br>&gt;&gt;<br>&gt;&gt; We did this already.<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; MatConvert(...);<br>&gt;&gt;&gt; MatCholeskyFactor(...);<br>&gt;&gt;&gt; MatMatSolve(...);<br>&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>&gt;&gt;<br>&gt;&gt; Yes.<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt; You can gather the matrix x onto all processes if you need the whole<br>&gt;&gt; result everywhere, but for performance reasons if you scale further, you<br>
&gt;&gt; should avoid it if possible.<br>&gt;&gt;<br>&gt; <br>&gt; <br>&gt; <br>&gt; <br></div>