On Apr 30, 2012, at 6:57 PM, Matthew Knepley wrote:
> On Mon, Apr 30, 2012 at 7:01 PM, Mohammad Mirzadeh <mirzadeh at gmail.com>
> wrote:
> Hi,
>
> Just a quick question. Following
> petsc-dev/src/ksp/ksp/examples/tutorials/ex2.c, it seems that I need to call
> both MatMPIAIJSetPreallocation and MatSeqAIJSetPreallocation to be able to
> preallocate for both MPI and Seq matrices. Does petsc automatically chose the
> relevant function when the code is run in serial and parallel?
Yes, it uses the relevant one and ignores any not relevant.
This is a common trick in PETSc. You can think of the calls as methods
specific to a particular subclass of the Mat class. PETSc automatically uses
all the methods that are appropriate for the particular subclass and ignores
all the other ones.
Barry
> In other words, what is the effect of
> MatMPIAIJSetPreallocation(MatSeqAIJSetPreallocation) when the code is run in
> serial(parallel)?
>
> I like how several functions are abstract and can be used both in serial and
> parallel (like MatCreate). Is there a similar way to just call a single
> "MatSetPreallocation" function?
>
> http://www.mcs.anl.gov/petsc/petsc-dev/docs/manualpages/Mat/MatXAIJSetPreallocation.html
>
> Matt
>
> Thanks,
> Mohammad
>
> On Wed, Apr 25, 2012 at 4:04 PM, Mohammad Mirzadeh <mirzadeh at gmail.com>
> wrote:
> Thanks Hong; that fixed the problem.
>
>
> On Wed, Apr 25, 2012 at 11:31 AM, Hong Zhang <hzhang at mcs.anl.gov> wrote:
> Mohammad:
>
> MatCreate(comm, &A);
> MatSetSizes(A, localRowSize, localColumnSize, globalRowSize,
> globalColumnSize);
> MatSetType(A, MATMPIAIJ);
> MatMPIAIJSetPreallocation(A, 0, d_nnz, 0, o_nnz);
> MatSetFromOptions(A);
> MatGetOwnershipRange(A, &rStart, &rEnd);
>
>
> This (even without MatSetType(A, MATMPIAIJ);) works with 3.2-p6 but not dev.
> The only difference I can see is 1) the order of MatSetFromOptions and 2) I
> do not call MatSeqAIJSetPreallocation which I think I do not need anyway. Is
> there something I'm doing wrong?
>
> MatSetFromOptions() must be called before MatMPIAIJSetPreallocation().
> If user set mattype at runtime, MatSetFromOptions() picks it and set the type
> accordingly. SetPreallocation()
> will be called after the type is set.
>
> Hong
>
> Mohammd
>
>
>
>
>
>
> --
> 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