Date: 2026-05-01T06:12:12+00:00

Actual source code: isreg.c

      1: #include <petsc/private/isimpl.h>

      3: PetscFunctionList ISList              = NULL;
      4: PetscBool         ISRegisterAllCalled = PETSC_FALSE;

      6: /*@
      7:   ISCreate - Create an index set object. `IS`, index sets, are PETSc objects used to do efficient indexing into other data structures such as `Vec` and `Mat`

      9:   Collective

     11:   Input Parameter:
     12: . comm - the MPI communicator

     14:   Output Parameter:
     15: . is - the new index set

     17:   Level: beginner

     19:   Notes:
     20:   When the communicator is not `MPI_COMM_SELF`, the operations on `is` are NOT
     21:   conceptually the same as `MPI_Group` operations. The `IS` are then
     22:   distributed sets of indices and thus certain operations on them are
     23:   collective.

     25: .seealso: [](sec_scatter), `IS`, `ISType()`, `ISSetType()`, `ISCreateGeneral()`, `ISCreateStride()`, `ISCreateBlock()`, `ISAllGather()`
     26: @*/
     27: PetscErrorCode ISCreate(MPI_Comm comm, IS *is)
     28: {
     29:   PetscFunctionBegin;
     30:   PetscAssertPointer(is, 2);
     31:   PetscCall(ISInitializePackage());

     33:   PetscCall(PetscHeaderCreate(*is, IS_CLASSID, "IS", "Index Set", "IS", comm, ISDestroy, ISView));
     34:   PetscCall(PetscLayoutCreate(comm, &(*is)->map));
     35:   (*is)->compressOutput = PETSC_TRUE;
     36:   PetscFunctionReturn(PETSC_SUCCESS);
     37: }

     39: /*@
     40:   ISSetType - Builds a index set, for a particular `ISType`

     42:   Collective

     44:   Input Parameters:
     45: + is     - The index set object
     46: - method - The name of the index set type

     48:   Options Database Key:
     49: . -is_type type - Sets the index set type; see `ISType`

     51:   Level: intermediate

     53:   Notes:
     54:   See `ISType` for available types (for instance, `ISGENERAL`, `ISSTRIDE`, or `ISBLOCK`).

     56:   Often convenience constructors such as `ISCreateGeneral()`, `ISCreateStride()` or  `ISCreateBlock()` can be used to construct the desired `IS` in one step

     58:   Use `ISDuplicate()` to make a duplicate

     60: .seealso: [](sec_scatter), `IS`, `ISGENERAL`, `ISBLOCK`, `ISGetType()`, `ISCreate()`, `ISCreateGeneral()`, `ISCreateStride()`, `ISCreateBlock()`
     61: @*/
     62: PetscErrorCode ISSetType(IS is, ISType method)
     63: {
     64:   PetscErrorCode (*r)(IS);
     65:   PetscBool match;

     67:   PetscFunctionBegin;
     69:   PetscCall(PetscObjectTypeCompare((PetscObject)is, method, &match));
     70:   if (match) PetscFunctionReturn(PETSC_SUCCESS);

     72:   PetscCall(ISRegisterAll());
     73:   PetscCall(PetscFunctionListFind(ISList, method, &r));
     74:   PetscCheck(r, PetscObjectComm((PetscObject)is), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown IS type: %s", method);
     75:   PetscTryTypeMethod(is, destroy);
     76:   is->ops->destroy = NULL;

     78:   PetscCall((*r)(is));
     79:   PetscCall(PetscObjectChangeTypeName((PetscObject)is, method));
     80:   PetscFunctionReturn(PETSC_SUCCESS);
     81: }

     83: /*@
     84:   ISGetType - Gets the index set type name, `ISType`, (as a string) from the `IS`.

     86:   Not Collective

     88:   Input Parameter:
     89: . is - The index set

     91:   Output Parameter:
     92: . type - The index set type name

     94:   Level: intermediate

     96: .seealso: [](sec_scatter), `IS`, `ISType`, `ISSetType()`, `ISCreate()`
     97: @*/
     98: PetscErrorCode ISGetType(IS is, ISType *type)
     99: {
    100:   PetscFunctionBegin;
    102:   PetscAssertPointer(type, 2);
    103:   if (!ISRegisterAllCalled) PetscCall(ISRegisterAll());
    104:   *type = ((PetscObject)is)->type_name;
    105:   PetscFunctionReturn(PETSC_SUCCESS);
    106: }

    108: /*@C
    109:   ISRegister - Adds a new index set implementation

    111:   Not Collective, No Fortran Support

    113:   Input Parameters:
    114: + sname    - The name of a new user-defined creation routine
    115: - function - The creation routine itself

    117:   Example Usage:
    118: .vb
    119:     ISRegister("my_is_name",  MyISCreate);
    120: .ve

    122:   Then, your vector type can be chosen with the procedural interface via
    123: .vb
    124:     ISCreate(MPI_Comm, IS *);
    125:     ISSetType(IS,"my_is_name");
    126: .ve
    127:   or at runtime via the option
    128: .vb
    129:     -is_type my_is_name
    130: .ve

    132:   Level: developer

    134:   Notes:
    135:   `ISRegister()` may be called multiple times to add several user-defined vectors

    137:   This is no `ISSetFromOptions()` and the current implementations do not have a way to dynamically determine type, so
    138:   dynamic registration of custom `IS` types will be of limited use to users.

    140: .seealso: [](sec_scatter), `IS`, `ISType`, `ISSetType()`, `ISRegisterAll()`, `ISRegisterDestroy()`
    141: @*/
    142: PetscErrorCode ISRegister(const char sname[], PetscErrorCode (*function)(IS))
    143: {
    144:   PetscFunctionBegin;
    145:   PetscCall(ISInitializePackage());
    146:   PetscCall(PetscFunctionListAdd(&ISList, sname, function));
    147:   PetscFunctionReturn(PETSC_SUCCESS);
    148: }