On Wed, Jan 13, 2010 at 9:16 AM, Umut Tabak <span dir="ltr">&lt;<a href="mailto:u.tabak@tudelft.nl">u.tabak@tudelft.nl</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Dear all,<br>
<br>
I am reading some FE system matrices from a commercial FE code. I wrote an interface where I export them in matrix market format. Also I keep the row and column indices of the non-zero values and as well the non-zeros values in arrays of proper type.<br>

<br>
The question which I could not conclude is that how to use MatSetValues for sparse matrix assignments, I mean should I keep all the values(non-zeros also) in my inputs?( There are also some pointers for block assignments but they work in the same way I guess)<br>

<br>
I have tested with the below code. If I supply only the non-zero diagonal entries, I get the first row set as expected but this did not seem so practical to me, because to get what I want accomplished I should keep all the zero entries as well. And I thought that there should be a far more efficient way to apply this. (Diagonal assignment is just an example.) I am sorry if this question is too naive :)<br>

<br>
Any comments is appreciated.<br>
Best regards,<br>
Umut<br>
<br>
  Mat            A;             /* linear system matrix */<br>
  PetscErrorCode ierr;<br>
  PetscInt       n = 4;<br>
  PetscInt       rI=0,cI=0;<br>
  PetscViewer    viewer;<br>
  PetscInt index;<br>
  //<br>
  //<br>
  // row indices,m column indices,n of Matrix A<br>
  const int idxm[] = { 0,1,2,3 };<br>
  const int idxn[] = { 0,1,2,3 };<br>
  // values in the matrix A, row major order<br>
  PetscScalar valuesMat[]={ 1,0,0,0,0,2,0,0,0,0,3,0,0,0,0,4 };<br>
  //PetscScalar valuesMat[]={ 1,2,3,4 };<br>
  /* should be the 1st call after the declaration and definition<br>
   * block<br>
   */<br>
  PetscInitialize(&amp;argc,&amp;args,(char *)0,help);<br>
  // added by U.Tabak<br>
  // intermediate assigments are<br>
  // set the values of the Matrix A<br>
  ierr = MatSetValues(A, n, idxm, n, idxn, valuesMat,INSERT_VALUES); CHKERRQ(ierr);<br>
 </blockquote><div><br>Should be<br><br>  for(int r = 0; r &lt; 4; ++r) {<br>    MatSetValues(A, 1, idxm[r], 1, idxn[r], &amp;valuesMat[r*4+r], INSERT_VALUES);<br>  }<br><br>The simplest way to use MatSetValues is to call it once per row.<br>
<br>   Matt<br> </div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"> // done so the 2nd argument should be<br>
  // MAT_FLUSH_ASSEMBLY<br>
  ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);                          CHKERRQ(ierr);<br>
  ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);                             CHKERRQ(ierr);<br>
  ierr = MatView(A,PETSC_VIEWER_STDOUT_WORLD);                           CHKERRQ(ierr);<br>
   ierr = PetscFinalize();CHKERRQ(ierr);<br>
  return 0;<br>
<br>
</blockquote></div><br><br clear="all"><br>-- <br>What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>-- Norbert Wiener<br>