<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Jan 29, 2018 at 8:18 PM, Ali Berk Kahraman <span dir="ltr"><<a href="mailto:aliberkkahraman@yahoo.com" target="_blank">aliberkkahraman@yahoo.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Yes, that is exactly what I am trying to do.<br>
<br>
In the documentation it says that MatGetRow cannot be used to alter the entries, it is only for examining them. So if I understand correctly, do you suggest:<br></blockquote><div><br></div><div>You are right, so it is not quite as easy as Barry suggests. If you code up the algorithm below, you will get an error on the second iteration</div><div>which says the matrix is not assembled. Look at the code for MatChop() here</div><div><br></div><div>  <a href="https://bitbucket.org/petsc/petsc/src/e49f4227a4aa635b95b6f78e8b19273a0cf7d2d5/src/mat/utils/axpy.c?at=master&fileviewer=file-view-default#axpy.c-385">https://bitbucket.org/petsc/petsc/src/e49f4227a4aa635b95b6f78e8b19273a0cf7d2d5/src/mat/utils/axpy.c?at=master&fileviewer=file-view-default#axpy.c-385</a></div><div><br></div><div>It does what you are doing. We could perhaps make a generic version where you pass in a function to modify the row values.</div><div><br></div><div>  Thanks,</div><div><br></div><div>     Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
1:MatGetRow, get the row<br>
<br>
2:MatSetValues, set the values<br>
<br>
3:Do not call assembly, instead call matRestoreRow, because the next MatGetRow will not need assembly (will it really not after matsetvalues on line 2?) (note: next MatGetRow will not need to reach these newly set values, it will work on a different row)<br>
<br>
4:go to step 1 for the next row<br>
<br>
<br>
Also, I can spare memory for 1 additional matrix. Should I just generate a new identical matrix with same values, using either MatCopy or MatConvert , and use MatGetValues on the old matrix and MatSetValues on the new matrix, hence no need for assembly on the new matrix until everything is done? If you think this is possible, how expensive would this be? Which function do you suggest (Copy or Convert)?<br>
<br>
<br>
Thank you for your answers and attention so far<br>
<br>
Ali<br>
<br>
<br>
<br>
On 29-01-2018 02:16, Smith, Barry F. wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
   From your code it looks like you are accessing values in a single row, changing them and then putting them back in the same row at the same index locations?<br>
<br>
    If this is the case you should use MatGetRow() to process the values, change the numerical entries in that row as needed and then call MatRestoreRow(). No need to call MatSetValues() and hence no business about unassembled matrices.<br>
<br>
    Will this work for you?<br>
<br>
    Barry<br>
<br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
On Jan 28, 2018, at 2:16 PM, Ali Berk Kahraman <<a href="mailto:aliberkkahraman@yahoo.com" target="_blank">aliberkkahraman@yahoo.com</a>> wrote:<br>
<br>
Dear Barry,<br>
<br>
I see what you are talking about, I have oversimplified my problem. The problem is that I will have to call MatGetValues on Wavelets matrix for every row in a loop. Thus, if I do not call assembly routine in the child function, it starts to give "not for unassembled matrix" error after the first loop. The relevant part of the code is appended on this e-mail. You can see the matgetvalues calls on line 81, and it is also in line 94's function GetWaveletPolyFit2DSingleRow_x<wbr>1.<br>
<br>
<br>
Ali<br>
<br>
<br>
On 28-01-2018 22:24, Smith, Barry F. wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
   In your code there is NO reason to call the MatAssemblyBegin/End where you do. Just pull it out and call it once. I submit this is the same for any other code. Please explain enough about your code (or send it) that has to call the assembly routines a different number of times. You just pull it above all the calls to MatSetValues().<br>
<br>
    Barry<br>
<br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
On Jan 28, 2018, at 1:15 PM, Ali Berk Kahraman <<a href="mailto:aliberkkahraman@yahoo.com" target="_blank">aliberkkahraman@yahoo.com</a>> wrote:<br>
<br>
Hello All,<br>
<br>
<br>
My apologies, I have closed this e-mail window and the first thing I read on the manual is "ALL processes that share a matrix MUST call MatAssemblyBegin() and MatAssemblyEnd() the SAME NUMBER of times". So I understand that petsc simply does not support unequal number of assembly calls.<br>
<br>
<br>
My question evolves then. I have a problem at hand where I do not know how many calls each process will make to MatAssembly routines. Any suggestions to make this work?<br>
<br>
On 28-01-2018 22:09, Ali Berk Kahraman wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Hello All,<br>
<br>
<br>
The code takes a parallel matrix and calls a function using that matrix. That function fills the specified row of that matrix with the id of the process that part of the matrix belongs in. You can see the short code in the attachment, it is about 80 lines.<br>
<br>
<br>
The problem is that the code gets into a deadlock at some point, usually at the last row  of each process except for the last process (greatest pid). I use petsc with configure options "--with-cc=gcc --with-cxx=g++ --with-fc=gfortran --download-mpich --download-fblaslapack".<br>
<br>
<br>
I am a beginner with MPI, so I do not know what may be causing this. My apologies in advance if this is a very trivial problem.<br>
<br>
<br>
Best Regards to All,<br>
<br>
<br>
Ali Berk Kahraman<br>
<br>
M.Sc. Student, Mechanical Eng.<br>
<br>
Bogazici Uni., Istanbul, Turkey<br>
<br>
</blockquote></blockquote></blockquote>
<PetscRealProblem.c><br>
</blockquote></blockquote>
<br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div>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</div><div><br></div><div><a href="http://www.caam.rice.edu/~mk51/" target="_blank">https://www.cse.buffalo.edu/~knepley/</a><br></div></div></div></div></div>
</div></div>