Assembling a matrix

Karin&NiKo niko.karin at gmail.com
Sat Dec 19 07:07:53 CST 2009


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>


More information about the petsc-users mailing list