Stefano,

   There is currently a PCFieldSplitSetBlockSize() and a PCSPAISetBlockSize()

PetscErrorCode MatSetBlockSize(Mat mat,PetscInt bs)
{
  PetscErrorCode ierr;

  PetscFunctionBegin;
  PetscValidHeaderSpecific(mat,MAT_CLASSID,1);
  PetscValidLogicalCollectiveInt(mat,bs,2);
  ierr = PetscLayoutSetBlockSize(mat->rmap,bs);CHKERRQ(ierr);
  ierr = PetscLayoutSetBlockSize(mat->cmap,bs);CHKERRQ(ierr);

PetscErrorCode PetscLayoutSetBlockSize(PetscLayout map,PetscInt bs)
{
  PetscFunctionBegin;
  if (bs < 0) PetscFunctionReturn(0);
  if (map->n > 0 && map->n % bs) SETERRQ2(map->comm,PETSC_ERR_ARG_INCOMP,"Local 
size %D not compatible with block size %D",map->n,bs);
  if (map->range && map->bs > 0 && map->bs != bs) 
SETERRQ2(map->comm,PETSC_ERR_ARG_INCOMP,"Cannot change block size %D to 
%D",map->bs,bs);
  if (map->mapping) {
    PetscInt       lbs;
    PetscErrorCode ierr;

    ierr = ISLocalToGlobalMappingGetBlockSize(map->mapping,&lbs);CHKERRQ(ierr);
    if (lbs != bs) SETERRQ2(map->comm,PETSC_ERR_PLIB,"Blocksize of 
localtoglobalmapping %D must match that of layout %D",lbs,bs);
  }
  map->bs = bs;
  PetscFunctionReturn(0);

So it doesn't want to change the block size if map->range has been set (i.e. 
PetscLayoutSetUp()) was called. But if the matrix is AIJ so long as  !(map->n % 
bs) one can actually set the block size at any time. So how about if I change 
the Mat code to allow setting the block size late for AIJ?  Maybe we can also 
get rid of PCFieldSplitSetBlockSize() and a PCSPAISetBlockSize()?

One issue that comes up with this change is: should setting the block size 
later automatically reset the block size of the two inner AIJ matrices? Or 
should they remain one? I could have it update the inner block sizes at the 
expense of a tiny bit more code. But one complication is that 
MatSetUpMultiply_MPIAIJ() always sets the column block size of the off-diagaonl 
matrix to 1; so this needs to be respected.

The PETSc design policy of "there is one way to do something" dictates that it 
is best not to have PCSetBlockSize() unless absolutely necessary so I am trying 
to see if it is absolutely necessary.

  Barry




> On Oct 10, 2016, at 10:18 AM, Stefano Zampini <[email protected]> 
> wrote:
> 
> Mark,
> 
> I was wondering if you could provide an API/command line customization for 
> PCGAMG to explicitly provide the "block size" of the problem to the gamg 
> solver, instead of using the block size of the matrix. The matrix block size 
> could be always used as a fallback if this new information as not been 
> provided.
> 
> I'm interfacing a complicated finite element package to PETSc , where you 
> cannot do any assumption on the blocksize of the problem during matrix setup, 
> and (AFAIK) I cannot change the block size with a call to MatSetBlockSize 
> after the matrix has been finalized without hacking (that I would like to 
> avoid). 
> 
> Thanks
> -- 
> Stefano

Reply via email to