Forming a sparse approximation of a MatShell
Jed Brown
jed at 59A2.org
Wed Apr 9 16:40:06 CDT 2008
On Wed 2008-04-09 15:10, Barry Smith wrote:
>
> Jed,
>
> The Mat coloring code can also be used directly, not through SNES. Once
> you have
> the coloring for the matrix (you can get that with MatGetColoring(), of
> course, this assumes
> you have already set a nonzero pattern for your matrix)). Call
> MatFDColoringCreate()
> then MatFDColoringSetFunction(), MatFDColoringSetFromOptions() and then
> MatFDColoringApply().
Cool, I tried this and I can confirm that it is generating the correct matrix
(by comparing entries with the output of -snes_fd) but unfortunately the matrix
entries of the spectral operator corresponding to neighbors are actually not a
very good approximation of the full operator. Bummer. It looks like I'm stuck
with formulating the problem twice, once for the spectral operators and once for
the FD/FE preconditioner. Thanks for the help.
Jed
> On Apr 9, 2008, at 2:13 PM, Jed Brown wrote:
>> I'm trying to improve the preconditioning of my spectral collocation
>> method for
>> non-Newtonian incompressible Stokes flow. My current algorithm uses
>> MatShell
>> for the full Jacobian as well as each of its blocks [A B1'; B2 0] and the
>> Schur
>> complement S = -B2*A*B1'. I needed a preconditioner for A so I thought
>> I'd
>> solve the same problem using finite differences on the Chebyshev nodes.
>> In
>> reality, the stencil is really ugly in 3D so I just used a simpler
>> elliptic
>> operator. This works okay, but it's performance decays significantly as I
>> increase the continuation parameter. Also, dealing with general boundary
>> conditions is rather tricky and it seems to be a much weaker
>> preconditioner when
>> I have mixed boundary conditions. To rectify this, I tried a finite
>> element
>> discretization on the Chebyshev nodes (using Q1 elements). This must be
>> scaled
>> by the inverse (lumped) mass matrix due to the collocation nature of the
>> spectral method. Strangely, even though it captures all the terms in the
>> Jacobian, it is slightly weaker than the finite difference version. At
>> least it
>> is less error-prone and boundary conditions are easier to get right.
>> Regardless, forming the explicit matrix separately from the spectral
>> matrix
>> causes a duplication of concepts that have to be kept in sync. So I
>> started
>> thinking, the spectral matrix is pretty cheap to apply a few times, so
>> perhaps I
>> can use a coloring to compute a sparse approximation. However, the
>> documentation I found is using the function from the SNES context to form
>> the
>> matrix. In my case, the entire Jacobian doesn't help, I just want an
>> approximation of A. (A itself is full, but implemented via FFT.) What is
>> the
>> correct way to do this? Should I just stick with finite differences or
>> finite
>> elements?
>>
>> Also, any ideas for preconditioning S? It's condition number also grows
>> significantly with the continuation parameter.
>>
>> Thanks,
>>
>> Jed
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: not available
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20080409/793844d4/attachment.pgp>
More information about the petsc-users
mailing list