Actual source code: partitionerreg.c

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

      3: PetscClassId PETSCPARTITIONER_CLASSID = 0;

      5: PetscFunctionList PetscPartitionerList              = NULL;
      6: PetscBool         PetscPartitionerRegisterAllCalled = PETSC_FALSE;

      8: /*@C
      9:   PetscPartitionerRegister - Adds a new PetscPartitioner implementation

     11:   Not Collective, No Fortran Support

     13:   Input Parameters:
     14: + sname    - The name of a new user-defined creation routine
     15: - function - The creation routine

     17:   Notes:
     18:   PetscPartitionerRegister() may be called multiple times to add several user-defined PetscPartitioners

     20:   Example Usage:
     21: .vb
     22:     PetscPartitionerRegister("my_part", MyPetscPartitionerCreate);
     23: .ve

     25:   Then, your PetscPartitioner type can be chosen with the procedural interface via
     26: .vb
     27:     PetscPartitionerCreate(MPI_Comm, PetscPartitioner *);
     28:     PetscPartitionerSetType(PetscPartitioner, "my_part");
     29: .ve
     30:   or at runtime via the option
     31: .vb
     32:     -petscpartitioner_type my_part
     33: .ve

     35:   Level: advanced

     37: .seealso: `PetscPartitionerRegisterAll()`

     39: @*/
     40: PetscErrorCode PetscPartitionerRegister(const char sname[], PetscErrorCode (*function)(PetscPartitioner))
     41: {
     42:   PetscFunctionBegin;
     43:   PetscCall(PetscFunctionListAdd(&PetscPartitionerList, sname, function));
     44:   PetscFunctionReturn(PETSC_SUCCESS);
     45: }

     47: PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Multistage(PetscPartitioner);
     48: PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_ParMetis(PetscPartitioner);
     49: PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_PTScotch(PetscPartitioner);
     50: PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Chaco(PetscPartitioner);
     51: PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Shell(PetscPartitioner);
     52: PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Simple(PetscPartitioner);
     53: PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Gather(PetscPartitioner);
     54: PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_MatPartitioning(PetscPartitioner);

     56: /*@C
     57:   PetscPartitionerRegisterAll - Registers all of the PetscPartitioner components in the DM package.

     59:   Not Collective

     61:   Level: advanced

     63: .seealso: `PetscPartitionerRegister()`, `PetscPartitionerRegisterDestroy()`
     64: @*/
     65: PetscErrorCode PetscPartitionerRegisterAll(void)
     66: {
     67:   PetscFunctionBegin;
     68:   if (PetscPartitionerRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS);
     69:   PetscPartitionerRegisterAllCalled = PETSC_TRUE;

     71:   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERPARMETIS, PetscPartitionerCreate_ParMetis));
     72:   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERPTSCOTCH, PetscPartitionerCreate_PTScotch));
     73:   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERCHACO, PetscPartitionerCreate_Chaco));
     74:   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERSIMPLE, PetscPartitionerCreate_Simple));
     75:   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERSHELL, PetscPartitionerCreate_Shell));
     76:   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERGATHER, PetscPartitionerCreate_Gather));
     77:   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERMATPARTITIONING, PetscPartitionerCreate_MatPartitioning));
     78:   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERMULTISTAGE, PetscPartitionerCreate_Multistage));
     79:   PetscFunctionReturn(PETSC_SUCCESS);
     80: }

     82: static PetscBool PetscPartitionerPackageInitialized = PETSC_FALSE;

     84: /*@C
     85:   PetscPartitionerFinalizePackage - This function finalizes everything in the PetscPartitioner package.
     86:   It is called from PetscFinalize().

     88:   Level: developer

     90: .seealso: `PetscInitialize()`
     91: @*/
     92: PetscErrorCode PetscPartitionerFinalizePackage(void)
     93: {
     94:   PetscFunctionBegin;
     95:   PetscCall(PetscFunctionListDestroy(&PetscPartitionerList));
     96:   PetscPartitionerPackageInitialized = PETSC_FALSE;
     97:   PetscPartitionerRegisterAllCalled  = PETSC_FALSE;
     98:   PetscFunctionReturn(PETSC_SUCCESS);
     99: }

    101: /*@C
    102:   PetscPartitionerInitializePackage - This function initializes everything in the PetscPartitioner package.

    104:   Level: developer

    106: .seealso: `PetscInitialize()`
    107: @*/
    108: PetscErrorCode PetscPartitionerInitializePackage(void)
    109: {
    110:   char      logList[256];
    111:   PetscBool opt, pkg;

    113:   PetscFunctionBegin;
    114:   if (PetscPartitionerPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
    115:   PetscPartitionerPackageInitialized = PETSC_TRUE;

    117:   /* Register Classes */
    118:   PetscCall(PetscClassIdRegister("GraphPartitioner", &PETSCPARTITIONER_CLASSID));
    119:   /* Register Constructors */
    120:   PetscCall(PetscPartitionerRegisterAll());
    121:   /* Register Events */
    122:   {
    123:     PetscCall(PetscLogEventRegister("PartMSSetUp", PETSCPARTITIONER_CLASSID, &PetscPartitioner_MS_SetUp));
    124:     for (PetscInt event = 0; event < PETSCPARTITIONER_MS_NUMSTAGE; event++) {
    125:       char ename[32];

    127:       PetscCall(PetscSNPrintf(ename, sizeof(ename), "PartMSStage %" PetscInt_FMT, event));
    128:       PetscCall(PetscLogEventRegister(ename, PETSCPARTITIONER_CLASSID, &PetscPartitioner_MS_Stage[event]));
    129:     }
    130:   }
    131:   /* Process Info */
    132:   {
    133:     PetscClassId classids[1];

    135:     classids[0] = PETSCPARTITIONER_CLASSID;
    136:     PetscCall(PetscInfoProcessClass("partitioner", 1, classids));
    137:   }
    138:   /* Process summary exclusions */
    139:   PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
    140:   if (opt) {
    141:     PetscCall(PetscStrInList("partitioner", logList, ',', &pkg));
    142:     if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCPARTITIONER_CLASSID));
    143:   }
    144:   /* Register package finalizer */
    145:   PetscCall(PetscRegisterFinalize(PetscPartitionerFinalizePackage));
    146:   PetscFunctionReturn(PETSC_SUCCESS);
    147: }