<div dir="ltr">MatDense is stored by column. Is that causing the problem?<br clear="all"><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">--Junchao Zhang</div></div></div><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Dec 17, 2020 at 6:00 AM Roland Richter <<a href="mailto:roland.richter@ntnu.no">roland.richter@ntnu.no</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div>
<p>Dear all,</p>
<p>I wanted to use PetscArraycpy for copying a part of one complex
matrix A with a row length of a_len and an offset of a_off into
another matrix B with a row length of b_len (smaller than a_len -
a_off), using the following code snippet:</p>
<p><i> PetscScalar *A_ptr, *B_ptr;</i><i><br>
</i><i> MatDenseGetArray(A, &A_ptr);</i><i><br>
</i><i> MatDenseGetArray(B, &B_ptr);</i><i><br>
</i><i> MatView(A, PETSC_VIEWER_STDOUT_WORLD);</i><i><br>
</i><i> for(size_t i = 0; i < num_local_rows; ++i) {</i><i><br>
</i><i> PetscArraycpy(B_ptr + i * b_len, (2 * a_off +
A_ptr) + i * a_len, b_len);</i><i><br>
</i><i> }</i></p>
<p><i> MatAssemblyBegin(B, MAT_FINAL_ASSEMBLY);</i><i><br>
</i><i> MatAssemblyEnd(B, MAT_FINAL_ASSEMBLY);</i><i><br>
</i><i> MatView(B, PETSC_VIEWER_STDOUT_WORLD);</i></p>
<p>When printing the first row of matrix A (with a_len = 128, a_off
= 76 and b_len = 26), I get <br>
</p>
<p><i>0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
-0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
-0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
-0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
-0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
-0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
-0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
-0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
-0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
-0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
-0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
-0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
-0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
-0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
-0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
-0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
-0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
-0.0000000000000000e+00 + 0.0000000000000000e+00i
-7.5118186821231378e-02 + -1.2515848507502547e-01i
5.7593629917958706e+00 + 1.6535197175842331e+00i
-6.3062119866941906e+01 + 3.2118985283369987e+01i
1.6228535942636518e+02 + -4.4588492144691378e+02i
8.7350162264986420e+02 + 2.0568440963147814e+03i
-7.4258479521622921e+03 + -3.3031631388498363e+03i
2.2699374989663269e+04 + -7.8289291098031481e+03i
-2.7846379282467926e+04 + 5.2456793075148809e+04i
-3.2554674832896777e+04 + -1.2108819252524960e+05i
1.9430868047197413e+05 + 1.2114559011378702e+05i
-3.5831799834334152e+05 + 7.0086227392363056e+04i
3.0028983479603863e+05 + -4.1447894788669585e+05i
7.8224949502036819e+04 + 6.2926756374162808e+05i
-5.3474873053744854e+05 + -4.4718914789259754e+05i
6.8111038372267899e+05 + -3.6947593166740131e+04i
-4.1287212326113920e+05 + 4.2925417635846150e+05i
7.1098224367113344e+03 + -4.6490743916366581e+05i
2.1807010096419850e+05 + 2.4106178223450572e+05i
-2.0304162108015743e+05 + -1.7254769976182859e+04i
9.0164628688356752e+04 + -7.0830186001321214e+04i
-8.9050769071193699e+03 + 5.7267241933255813e+04i
-1.4789632694550470e+04 + -2.1786332309775924e+04i
1.0491004489879153e+04 + 2.3873712516742830e+03i
-3.4183915782335853e+03 + 1.9886861075931499e+03i
3.7807432692260045e+02 + -1.2521184263406540e+03i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
-0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
-0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
-0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
-0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
-0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i</i></p>
<p>and for the first row of B I get <br>
</p>
<p><i>-0.0000000000000000e+00 + 0.0000000000000000e+00i
-7.5118186821231378e-02 + -1.2515848507502547e-01i
5.7593629917958706e+00 + 1.6535197175842331e+00i
-6.3062119866941906e+01 + 3.2118985283369987e+01i
1.6228535942636518e+02 + -4.4588492144691378e+02i
8.7350162264986420e+02 + 2.0568440963147814e+03i
-7.4258479521622921e+03 + -3.3031631388498363e+03i
2.2699374989663269e+04 + -7.8289291098031481e+03i
-2.7846379282467926e+04 + 5.2456793075148809e+04i
-3.2554674832896777e+04 + -1.2108819252524960e+05i
1.9430868047197413e+05 + 1.2114559011378702e+05i
-3.5831799834334152e+05 + 7.0086227392363056e+04i
3.0028983479603863e+05 + -4.1447894788669585e+05i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
6.9004764357806349e-310 + 6.9004764357806349e-310i
6.9004764365446580e-310 + 6.9004764300000669e-310i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i
0.0000000000000000e+00 + 0.0000000000000000e+00i</i></p>
<p>Apparently, only 13 complex values have been copied, and not 26.
Moreover, if my source destination is chosen to be (a_off + A_ptr)
instead, I will just copy 0-values. When increasing the number of
values I would like to copy, nothing changes (except getting a
segfault for sufficient large values).</p>
<p>Why does that happen? And how can I copy all values into the
second matrix, and not only half of them?</p>
<p>Another question: Is there a parallel version of that function,
to copy all local rows in parallel, or do I have to write it
myself, for example by using OpenMP?</p>
<p>Thanks!</p>
<p>Roland<br>
</p>
<p><br>
</p>
<p><br>
</p>
</div>
</blockquote></div>