Hi, I would also greatly appreciate reading this code! Perhaps, other users also would! Could you please post it on this mailing list or somewhere on PETSc's web site? Thanks, Nicolas
2009/12/19 Douglas Arnold <arnold at umn.edu> > For me, two copies of the matrix is not a problem. That is what I was > looking for but didn't find, something that efficiently copied a sparse > matrix into a bigger sparse matrix. I would appreciate > receiving the code for the sequential case, if it is not much > bother for you. > > Thanks. -- Doug > > > On 12/18/2009 06:12 PM, Barry Smith wrote: > >> >> The issue is that the data structures that PETSc uses to store the >> sparse matrices are not designed to allow changing the matrix size, thus >> if you have the matrix A as a PETSc sparse matrix creating B means >> copying the entire matrix, thus two copies of the matrix, more memory >> usage. Now if memory is not an issue for you, the copying can be done >> efficiently order nz work. I can send you code for the sequential case. >> >> If you don't want two copies of the matrix for memory reasons, could you >> "lie" to the part of the code that generates A and have it create the A >> with an extra row and column that it simply does not use? So in the >> MatSetSizes() you just set it 1 larger then it is. Then call the >> MatSetValues() to fill up A then call the MatSetValues() to put in the v >> and c part without calling MatAssemblyBegin/End() in between and you >> will have an efficient code in both time and memory usage. >> >> Barry >> >> On Dec 18, 2009, at 5:59 PM, Douglas Arnold wrote: >> >> Anirban Chatterjee asked how to assemble an (n+1)x(n+1) sparse matrix >>> >>> B = [A v; >>> v^T c] >>> >>> from an nxn sparse matrix A, a vector v, and a scalar c. Matt >>> Knepley and Barry Smith advised against it. >>> >>> I have pretty much the same problem and I want to make sure I >>> understand the situation. In my case, the matrix A comes to me >>> from another application that I would rather not fiddle with. >>> The rank of A is n-1 and v is a vector in its nullspace, c=0. I would >>> like to solve a system with the matrix B by a direct solver, and >>> so I think I need to assemble it. Do I understand correctly that >>> there is no efficient way to do this in PETSc? Even in a sequential >>> computation? >>> >>> -- Doug >>> >>> >>> Where will the "new" row live? On the last process, why that one? >>>> >>>> Does the matrix A have to be completely assembled before the v is >>>> computed? Or can the entries of A be computed at the same time as the v? >>>> >>>> PETSc doesn't have code to efficiently dynamically change the size >>>> of a matrix. Thus generating a new matrix from a given sparse matrix >>>> plus a new row requires a complete copy of the starting matrix into >>>> the new matrix data structure. If you assemble the entire matrix >>>> together without first generating the smaller matrix A then it is >>>> easy; just generate the preallocation structure of A with the one >>>> additional row/column information and call MatSetValues() to put in >>>> the parts of A and the parts of v. >>>> >>>> Barry >>>> >>>> On Dec 8, 2009, at 4:05 PM, Anirban Chatterjee wrote: >>>> >>>> Hi, >>>>> >>>>> I have an nxn matrix A, a column vector v and a scalar c. I want to >>>>> assemble a matrix B as follows, >>>>> B = [A v; >>>>> v^T c] >>>>> Can someone tell me the easiest and most efficient way to do this. >>>>> >>>>> --Anirban >>>>> >>>> >> -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20091219/de5feda2/attachment.htm>
