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

Reply via email to