Assembling a matrix
Barry Smith
bsmith at mcs.anl.gov
Sat Dec 19 14:55:40 CST 2009
Doug,
Please find attached the sample program. I have also added it as
src/mat/examples/tutorials/ex12.c in petsc-dev
Barry
On Dec 18, 2009, at 6:16 PM, Douglas Arnold wrote:
> 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 --------------
A non-text attachment was scrubbed...
Name: ex12.c
Type: application/octet-stream
Size: 3425 bytes
Desc: not available
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20091219/4ef83f1d/attachment.obj>
More information about the petsc-users
mailing list