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 >
