On Nov 25, 2010, at 4:54 AM, Jed Brown wrote:

> On Thu, Nov 25, 2010 at 11:39, Dave May <dave.mayhem23 at gmail.com> wrote:
> ierr = MatCreate( PETSC_COMM_WORLD, &j22 );CHKERRQ(ierr);
>  ierr = MatSetSizes( j22, PETSC_DECIDE, PETSC_DECIDE, 1, 1 );CHKERRQ(ierr);
>  ierr = MatSetType( j22, MATSEQAIJ );CHKERRQ(ierr);
> 
> produces
> j22->rmap->n = -1
> j22->cmap->n = -1
> 
> I'm not sure why, but PetscLayoutSetUp is called in 
> MatSeqAIJSetPreallocation_SeqAIJ, not MatCreate_SeqAIJ.  There was probably a 
> reason for the present choice.
> 
> Jed

   It used to be that you had to set the sizes BEFORE setting the type. Then we 
allowed setting the type first, this was implemented by caching the 
MatCreate_SeqAIJ() function and using it when the sizes are set. Then it was 
changed to not caching the create function and instead calling it immediately 
and delaying the computation of sizes etc until the preallocation call. 

   Hence the calling sequence above does not result in sizes be properly set 
yet. 

   The reason this doesn't cause grief everywhere is that most Mat functions 
start with a MatPreallocated() that makes sure the setting of sizes is done. 

   The easiest fix would be to put MatPreallocated()  at the beginning of 
MatGetSizes() and whatever else doesn't have it.  I don't know if there would 
be any bad side affects to making this change.

   Note that MatPreallocated() is kind of like a XXXSetUp()  for matrices, it 
may be we want to formalize this a bit more to make the "style" of Mat match 
PC, KSP, SNES etc more.

   Barry



Reply via email to