[petsc-users] Matrix Construction Question
Barry Smith
bsmith at mcs.anl.gov
Tue Jul 5 15:39:09 CDT 2011
MatSolve() and MatMatSolve() will not return the transpose of the solution, they will return the solution. If you want the transpose solve you can use MatSolveTranspose() for a single Vec or use MatMatSolve() for the matrix case after transposing the original matrix if you want the transpose.
Barry
On Jul 5, 2011, at 12:17 PM, Adam Byrd wrote:
> I have working code that produces the correct answer now, thank you. One (hopefully) final question, though. The solution is actually transposed. What causes this? Presumably I can use MatMatSolveTranspose to get around this, but there's no man page and I want to be sure of what will happen in all cases.
>
> Respectfully,
> Adam
>
> On Thu, Jun 30, 2011 at 4:18 PM, Hong Zhang <hzhang at mcs.anl.gov> wrote:
> Add
> ierr = MatGetOrdering(testMat,MATORDERING_ND,&isrow,&iscol);CHKERRQ(ierr);
> before the line
> ierr = MatFactorInfoInitialize(&luinfo);CHKERRQ(ierr);
>
> Somehow, your matrix is numerically singular. With
> MATORDERING_NATURAL
> I get
> [0]PETSC ERROR: Detected zero pivot in LU factorization
>
> even using MATDENSE matrix format, which calls lapack.
> With MATORDERING_ND, I get useless inverseMat.
>
> The modified code I used is attached.
>
> Hong
>
> On Thu, Jun 30, 2011 at 2:30 PM, Adam Byrd <adam1.byrd at gmail.com> wrote:
> > I'm trying to work through what I need to do, again by practicing with a
> > small scale random problem. The general order of events seems to be: create
> > a matrix, fill it, assemble it, factor it, then one can use solvers with it.
> > When I use MatLUFactor on my matrix before using it with a solver I get this
> > error:
> > [0]PETSC ERROR: --------------------- Error Message
> > ------------------------------------
> > [0]PETSC ERROR: Null argument, when expecting valid pointer!
> > [0]PETSC ERROR: Null Object: Parameter # 1!
> > [0]PETSC ERROR:
> > ------------------------------------------------------------------------
> > [0]PETSC ERROR: Petsc Release Version 3.1.0, Patch 8, Thu Mar 17 13:37:48
> > CDT 2011
> > [0]PETSC ERROR: See docs/changes/index.html for recent updates.
> > [0]PETSC ERROR: See docs/faq.html for hints about trouble shooting.
> > [0]PETSC ERROR: See docs/index.html for manual pages.
> > [0]PETSC ERROR:
> > ------------------------------------------------------------------------
> > [0]PETSC ERROR: ./test on a osx-gnu-c named Macintosh-3.local by adambyrd
> > Thu Jun 30 15:27:30 2011
> > [0]PETSC ERROR: Libraries linked from
> > /Users/adambyrd/soft/petsc-3.1-p8/osx-gnu-cpp/lib
> > [0]PETSC ERROR: Configure run at Tue Jun 28 12:56:55 2011
> > [0]PETSC ERROR: Configure options PETSC_ARCH=osx-gnu-cpp --with-fc=gfortran
> > -download-f-blas-lapack=1 --download-mpich=1 --with-scalar-type=complex
> > --with-clanguage=c++
> > [0]PETSC ERROR:
> > ------------------------------------------------------------------------
> > [0]PETSC ERROR: ISInvertPermutation() line 209 in
> > src/vec/is/interface/index.c
> > [0]PETSC ERROR: MatLUFactorSymbolic_SeqAIJ() line 306 in
> > src/mat/impls/aij/seq/aijfact.c
> > [0]PETSC ERROR: MatLUFactorSymbolic() line 2534 in
> > src/mat/interface/matrix.c
> > [0]PETSC ERROR: MatLUFactor_SeqAIJ() line 945 in
> > src/mat/impls/aij/seq/aijfact.c
> > [0]PETSC ERROR: MatLUFactor() line 2417 in src/mat/interface/matrix.c
> > [0]PETSC ERROR: main() line 62 in WDtest.cpp
> > application called MPI_Abort(MPI_COMM_WORLD, 85) - process 0[unset]:
> > aborting job:
> > application called MPI_Abort(MPI_COMM_WORLD, 85) - process 0
> > I don't understand what I'm doing wrong.
> > Respectfully,
> > Adam
> > On Wed, Jun 29, 2011 at 1:26 AM, Matthew Knepley <knepley at gmail.com> wrote:
> >>
> >> On Tue, Jun 28, 2011 at 10:20 PM, Adam Byrd <adam1.byrd at gmail.com> wrote:
> >>>
> >>> Matt,
> >>>
> >>> Alright, that means I need to continue learning how to use
> >>> MatSetValues(). With my 6x6 example I tried filling it with four 3x3 sub
> >>> matrices, but when I do that I get the error 'sum of local sizes 12 does not
> >>> equal global size.' I had 4 processors each calling MatSetValues for their
> >>> own 3x3. Graphically, I arranged the nodes 0 1
> >>>
> >>> 2 3
> >>> where process 0 had global rows 0-2 and global columns 0-2; process 1 had
> >>> 0-2, 3-5; process 2 had 3-5, 0-2; and process 3 had 3-5, 3-5. >From the
> >>> documentation, I think this should be correct, but I'm not sure. Also, which
> >>> format would you recommend for storing the matrix?
> >>
> >> 1) With any error, send the Entire error message.
> >> 2) PETSc matrices are divided by rows, not rows and columns, see the
> >> manual section. Rows & columns only makes sense for dense matrices
> >> 3) You can still set arbitrary blocks no matter how the matrix is divided
> >> 4) The error means you tried to set both local and global dimensions, and
> >> they do not add up correctly. Just set the global dimensions
> >> Matt
> >>
> >>>
> >>> Jack,
> >>>
> >>> I'm a summer intern just getting started with this project, so I don't
> >>> know all the details yet (I can ask though). I know I need to find the
> >>> Green's function which will involve the trace of the inverted Hamiltonian,
> >>> as well as the rest of the matrix. I have inquired about avoiding the
> >>> inversion altogether, but my instructor doesn't believe there is a way
> >>> around it. Once I've worked through the math I want to explore other options
> >>> though.
> >>>
> >>> Respectfully,
> >>> Adam
> >>>
> >>> On Tue, Jun 28, 2011 at 6:08 PM, Matthew Knepley <knepley at gmail.com>
> >>> wrote:
> >>>>
> >>>> On Tue, Jun 28, 2011 at 5:01 PM, Adam Byrd <adam1.byrd at gmail.com> wrote:
> >>>>>
> >>>>> Actually, it's quite sparse. In the 3600x3600 there are only just 4
> >>>>> nonzero entries in each row. This means it's 99.9% empty. My smaller 6x6
> >>>>> example is dense, but it's only practice building and manipulating matrices.
> >>>>
> >>>> Ah, then its easy. Just call MatSetValues() with each block. Then use
> >>>> MUMPS to do a sparse direct solve.
> >>>> Matt
> >>>>
> >>>>>
> >>>>> Respectfully,
> >>>>> Adam
> >>>>>
> >>>>> On Tue, Jun 28, 2011 at 5:55 PM, Matthew Knepley <knepley at gmail.com>
> >>>>> wrote:
> >>>>>>
> >>>>>> It sounds like you have a dense matrix (from your example). Is this
> >>>>>> true? If so, you should use Elemental (on Google Code).
> >>>>>> Thanks,
> >>>>>> Matt
> >>>>>>
> >>>>>> On Tue, Jun 28, 2011 at 8:55 AM, Adam Byrd <adam1.byrd at gmail.com>
> >>>>>> wrote:
> >>>>>>>
> >>>>>>> Hi,
> >>>>>>> I'm rather new to PETSc and trying to work out the best way to create
> >>>>>>> and fill a large sparse matrix distributed over many processors. Currently,
> >>>>>>> my goal is to create a 3600x3600 matrix in units of 12x12 blocks with
> >>>>>>> several blocks on any given node. I'd like to create the matrix in such a
> >>>>>>> way that each node only holds the information in it's handful of blocks and
> >>>>>>> not the entire matrix. Eventually, this matrix is to be inverted (I know,
> >>>>>>> inversion should be avoided, but as this is a Hamiltonian matrix from which
> >>>>>>> I need the Green's function, I'm unaware of a way to forgo carrying out the
> >>>>>>> inversion). Additionally, the values will be changed slightly and the matrix
> >>>>>>> will be repeatedly inverted. It's structure will remain the same. In order
> >>>>>>> to learn how to do this is I am starting with a small 6x6 matrix broken into
> >>>>>>> four 3x3 blocks and distributed one block per node. I've been able to create
> >>>>>>> a local 3x3 matrix on each node, with it's own values, and with the global
> >>>>>>> row/column IDs correctly set to [0, 1, 2] or [3, 4, 5] depending on where
> >>>>>>> the block is in the matrix. My problem manifests when I try to create the
> >>>>>>> larger matrix from the individual smaller ones. When the matrix is
> >>>>>>> constructed I'm trying to use MatSetValues and having each node pass in it's
> >>>>>>> 3x3 block. I end up with an error that the sum of local lengths 12x12 does
> >>>>>>> not match the global length 6x6. It appears as though this is from passing
> >>>>>>> in four 3x3s and the program interpreting that as a 12x12 instead of as a
> >>>>>>> 6x6 with the blocks in a grid.
> >>>>>>> My question is then: is it possible to fill a matrix as a grid of
> >>>>>>> blocks, or can I only fill it in groups of rows or columns? Also, am I
> >>>>>>> approaching this problem the correct way, or are there more efficient ways
> >>>>>>> of building this matrix with the ultimate goal of inverting it?
> >>>>>>> I have included my copy of a modified example if it helps. I do
> >>>>>>> apologize if this is answered somewhere in the documentation, I have been
> >>>>>>> unable to find a solution.
> >>>>>>> Respectfully,
> >>>>>>> Adam
> >>>>>>
> >>>>>>
> >>>>>> --
> >>>>>> 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
> >>>>>
> >>>>
> >>>>
> >>>>
> >>>> --
> >>>> 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
> >>>
> >>
> >>
> >>
> >> --
> >> 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