[petsc-users] Create identity IS

Florian Lindner mailinglists at xgm.de
Mon Apr 20 07:23:55 CDT 2015


Am Montag, 20. April 2015, 14:57:58 schrieb Lisandro Dalcin:
> On 20 April 2015 at 14:35, Florian Lindner <mailinglists at xgm.de> wrote:
> > Hello,
> >
> > I use an index set for a row mapping but don't want to use one for the column mapping.
> >
> > I try to create an idenitity index set to supply to ISLocalToGlobalMappingCreateIS and MatSetLocalToGlobalMapping:
> >
> >   IS is;
> >   ISCreate(PETSC_COMM_WORLD, &is);
> 
> At this point the index set does not have the type set.
> 
> >   ISSetIdentity(is);
> >
> > but I get an segmentation fault at the last line.
> >
> 
> Bad error checking, you should get an error saying that the type is not yet set.
> 
> > What is the best way to create an identity index set?
> >
> 
> I would use ISCreateStride(), and perhaps next ISToGeneral() if you
> really want a ISGENERAL type.

All I want is an identity index set, that I can use with ISLocalToGlobalMappingCreateIS and MatSetLocalToGlobalMapping.

Problem is when I know only the local size, not the global size of the matrix

ISCreateStride(PETSC_COMM_WORLD, nLocal, 0, 1, &is); followed by ISAllGather(is, &isg); gives an IS like that:

0 0
1 1
2 2
3 3
4 0
5 1
6 2
7 3

so 0 to 3 are mapped twice, while the rest is not mapped. Just using the local IS, without ISAllGather gives an Argument out of range at MatSetValuesLocal.

EDIT: Got it now using:

  ISCreateStride(PETSC_COMM_WORLD, A.ownerRange().second - A.ownerRange().first, A.ownerRange().first, 1, &is);
  ISSetIdentity(is);

  ISView(is, PETSC_VIEWER_STDOUT_WORLD);
  ISAllGather(is, &isg);
  if (rank==0)
    ISView(isg, PETSC_VIEWER_STDOUT_SELF);
  
  ISLocalToGlobalMapping mapping;
  ISLocalToGlobalMappingCreateIS(isg, &mapping);
  MatSetLocalToGlobalMapping(A.matrix, mapping, mapping);

based on the owner range.


More information about the petsc-users mailing list