zero out columns
Barry Smith
bsmith at mcs.anl.gov
Fri Jan 18 08:41:52 CST 2008
You can also use MatGetSubMatrix() to pull out the part of the
matrix you want to keep;
this is actually efficient speed-wise, the drawback is that it
requires memory since it
is storing essentially two copies of the matrices.
Barry
On Jan 18, 2008, at 8:34 AM, Matthew Knepley wrote:
> I am guessing that you want to do this in order to
>
> 1) enforce a Dirichlet condition (or other strong condition)
>
> 2) maintain symmetry in the system
>
> If not, maybe you are stuck with the solution below. However, if
> you are setting boundary conditions, I would strongly advise you
> to eliminate those variables up front. I have solved systems of
> this kind for more than a decade and have tried every approach.
> I believe the best one (except for active set optimization problems)
> is to eliminate the constrained variables.
>
> PETSc provides a nice mechanism for doing so. You must generate
> some sort of map from degrees of freedom to Vec/Mat indices. For
> constrained variables, map them to a negative index. Then when
> you call MatSetValues/VecSetValues() they will be ignored
> automatically.
> This is the bottom layer of my BC handling.
>
> Thanks,
>
> Matt
>
> On Jan 18, 2008 4:32 AM, Toby D. Young <tyoung at ippt.gov.pl> wrote:
>>
>>
>>
>> Hello users,
>>
>> The procedure I wish to program with petsc requires setting a
>> series of
>> matrix elements to zero, and for a given number of rows and columns.
>> The operation is intended to run for large parallel sparse matrices.
>>
>> Using MatZeroRowsIS() I can easily achieve zeroing out the rows I
>> want
>> and now I am wondering how to zero out the columns. I imagine there
>> are
>> a few other ways of doing this, I've come up with two:
>>
>>
>> Method 1
>> MatGetColumnIJ() // get a specified column
>> VecSetValues() // set wanted indices to zero
>> MatRestoreColumnIJ() // restore vector to the matrix
>>
>> The Petsc manual warns "Since PETSc matrices are usually stored in
>> compressed row format, this routine will generally be
>> slow." (of MatGetColumnIJ).
>>
>> Method 2
>> MatTranspose() // Take the transpose of the matrix
>> MatZeroRowsIS() // Zeroi out the row which was the target column
>>
>> This requires creating a new matrix, i.e. the transpose and then
>> releasing memory from the old matrix. The advantage is that it is
>> relatively straightforward to code up.
>>
>> The rather obvious third way is to simply force the column elements
>> to
>> be zero with MatSetValues() which, I am guessing, is not likely to be
>> efficient and I am not really considering this.
>>
>> I am wondering if anyone has a clue as to which of the methods
>> above is
>> likely to be more efficient for large parallel sparse matrices.
>> Perhaps
>> someone may have a suggesttion for an alternative approach.
>>
>> Thanks in advance.
>>
>> Best,
>> Toby
>>
>>
>>
>>
>> --
>>
>> Toby D. Young - Adiunkt (Assistant Professor)
>> Department of Computational Science
>> Institute of Fundamental Technological Research
>> Polish Academy of Sciences
>> Room 206, Swietokrzyska 21
>> 00-049 Warsaw, POLAND
>>
>>
>
>
>
> --
> What most experimenters take for granted before they begin their
> experiments is infinitely more interesting than any results to which
> their experiments lead.
> -- Norbert Wiener
>
More information about the petsc-users
mailing list