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

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

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

 20:   Sample 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: {

 45:   PetscFunctionListAdd(&PetscPartitionerList, sname, function);
 46:   return(0);
 47: }

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

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

 60:   Not Collective

 62:   Input parameter:
 63: . path - The dynamic library path

 65:   Level: advanced

 67: .seealso:  PetscPartitionerRegister(), PetscPartitionerRegisterDestroy()
 68: @*/
 69: PetscErrorCode PetscPartitionerRegisterAll(void)
 70: {

 74:   if (PetscPartitionerRegisterAllCalled) return(0);
 75:   PetscPartitionerRegisterAllCalled = PETSC_TRUE;

 77:   PetscPartitionerRegister(PETSCPARTITIONERPARMETIS, PetscPartitionerCreate_ParMetis);
 78:   PetscPartitionerRegister(PETSCPARTITIONERPTSCOTCH, PetscPartitionerCreate_PTScotch);
 79:   PetscPartitionerRegister(PETSCPARTITIONERCHACO,    PetscPartitionerCreate_Chaco);
 80:   PetscPartitionerRegister(PETSCPARTITIONERSIMPLE,   PetscPartitionerCreate_Simple);
 81:   PetscPartitionerRegister(PETSCPARTITIONERSHELL,    PetscPartitionerCreate_Shell);
 82:   PetscPartitionerRegister(PETSCPARTITIONERGATHER,   PetscPartitionerCreate_Gather);
 83:   PetscPartitionerRegister(PETSCPARTITIONERMATPARTITIONING, PetscPartitionerCreate_MatPartitioning);
 84:   return(0);
 85: }

 87: static PetscBool PetscPartitionerPackageInitialized = PETSC_FALSE;

 89: /*@C
 90:   PetscPartitionerFinalizePackage - This function finalizes everything in the PetscPartitioner package.
 91:   It is called from PetscFinalize().

 93:   Level: developer

 95: .seealso: PetscInitialize()
 96: @*/
 97: PetscErrorCode  PetscPartitionerFinalizePackage(void)
 98: {

102:   PetscFunctionListDestroy(&PetscPartitionerList);
103:   PetscPartitionerPackageInitialized = PETSC_FALSE;
104:   PetscPartitionerRegisterAllCalled  = PETSC_FALSE;
105:   return(0);
106: }

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

111:   Level: developer

113: .seealso: PetscInitialize()
114: @*/
115: PetscErrorCode  PetscPartitionerInitializePackage(void)
116: {
117:   char           logList[256];
118:   PetscBool      opt,pkg;

122:   if (PetscPartitionerPackageInitialized) return(0);
123:   PetscPartitionerPackageInitialized = PETSC_TRUE;

125:   /* Register Classes */
126:   PetscClassIdRegister("GraphPartitioner",&PETSCPARTITIONER_CLASSID);
127:   /* Register Constructors */
128:   PetscPartitionerRegisterAll();
129:   /* Register Events */
130:   /* Process Info */
131:   {
132:     PetscClassId  classids[1];

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