#if !defined(PETSCISTYPES_H)
#define PETSCISTYPES_H

/* SUBMANSEC = IS */

/*S
     IS - Abstract PETSc object that used for efficient indexing

   Level: beginner

.seealso: `ISCreateGeneral()`, `ISCreateBlock()`, `ISCreateStride()`, `ISGetIndices()`, `ISDestroy()`
S*/
typedef struct _p_IS *IS;

/*S
   ISLocalToGlobalMapping - mappings from an arbitrary
      local ordering from 0 to n-1 to a global PETSc ordering
      used by a vector or matrix.

   Level: intermediate

   Notes:
   Mapping from local to global is scalable; but global
   to local may not be if the range of global values represented locally
   is very large.

   `ISLocalToGlobalMapping` is actually a private object; it is included
   here for the inline function `ISLocalToGlobalMappingApply()` to allow it to be inlined since
   it is used so often.

.seealso: `ISLocalToGlobalMappingCreate()`, `ISLocalToGlobalMappingApply()`, `ISLocalToGlobalMappingDestroy()`
S*/
typedef struct _p_ISLocalToGlobalMapping *ISLocalToGlobalMapping;

/*S
     ISColoring - sets of IS's that define a coloring of something, such as a graph defined by a sparse matrix

   Level: intermediate

    Notes:
    One should not access the *is records below directly because they may not yet
    have been created. One should use `ISColoringGetIS()` to make sure they are
    created when needed.

    When the coloring type is `IS_COLORING_LOCAL` the coloring is in the local ordering of the unknowns.
    That is the matching the local (ghosted) vector; a local to global mapping must be applied to map
    them to the global ordering.

    Developer Note:
    This is not a `PetscObject`

.seealso: `ISColoringCreate()`, `ISColoringGetIS()`, `ISColoringView()`
S*/
typedef struct _n_ISColoring *ISColoring;

/*S
     PetscLayout - defines layout of vectors and matrices across processes (which rows are owned by which processes)

   Level: developer

.seealso: `PetscLayoutCreate()`, `PetscLayoutDestroy()`
S*/
typedef struct _n_PetscLayout *PetscLayout;

#endif
