[petsc-users] MatPtAP

Samuel Lanthaler s.lanthaler at gmail.com
Fri Jun 1 11:07:09 CDT 2018


On 06/01/2018 03:42 PM, Matthew Knepley wrote:
> On Fri, Jun 1, 2018 at 9:21 AM, Samuel Lanthaler 
> <s.lanthaler at gmail.com <mailto:s.lanthaler at gmail.com>> wrote:
>
>     Hi,
>
>     I was wondering what the most efficient way to use MatPtAP would
>     be in the following situation: I am discretizing a PDE system. The
>     discretization yields a matrix A that has a band structure (with k
>     upper and lower bands, say). In order to implement the boundary
>     conditions, I use a transformation matrix P which is essentially
>     the unit matrix, except for the entries P_{ij} where i,j<k and
>     n-i,n-j<k, so
>
>     P =  [ B, 0, 0, 0, ..., 0, 0 ]
>            [  0, 1, 0, 0, ..., 0, 0 ]
>            [                              ]
>            [                              ]
>            [                  ..., 1, 0 ]
>            [  0, 0, 0, 0, ..., 0, C ]
>
>     with B,C are (k-by-k) matrices.
>     Right now, I'm simply constructing A, P and calling
>
>         CALL
>     MatPtAP(petsc_matA,petsc_matP,MAT_INITIAL_MATRIX,PETSC_DEFAULT_REAL,petsc_matPtAP,ierr)
>
>     where I haven't done anything to pestc_matPtAP, prior to this
>     call. Is this the way to do it?
>
>     I'm asking because, currently, setting up the matrices A and P
>     takes very little time, whereas the operation MatPtAP is taking
>     quite long, which seems very odd... The matrices are of type
>     MPIAIJ. In my problem, the total matrix dimension is around 10'000
>     and the matrix blocks (B,C) are of size ~100.
>
>
> Are you sure this is what you want to do? Usually BC are local, since 
> by definition PDE are local, and
> are applied pointwise. What kind of BC do you have here?
>

The boundary conditions are a mixture of Dirichlet and Neumann; in my 
case, the PDE is a system involving 8 variables on a disk, where the 
periodic direction is discretized using a Fourier series expansion, the 
radial direction uses B-splines.

In reality, I have two matrices A,B, and want to solve the eigenvalue 
problem \lambda*B*x = A*x.
I found it quite convenient to use a transformation P to a different set 
of variables y, such that x=P*y and x satisfies the BC iff certain 
components of y are 0. The latter is enforced by inserting spurious 
eigenvalues at the relevant components of y in the transformed 
eigenvalue problem \lambda*Pt*B*P*y=Pt*A*P*y. After solving the EVP in 
terms of y, I get back x=P*y.
Is this an inherently bad/inefficient way of enforcing BC's? Thanks.




>   Thanks,
>
>     Matt
>
>     Thanks in advance for any ideas.
>
>     Cheers,
>     Samuel
>
>
>
>
> -- 
> 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
>
> https://www.cse.buffalo.edu/~knepley/ <http://www.caam.rice.edu/%7Emk51/>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20180601/931de0b8/attachment.html>


More information about the petsc-users mailing list