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: }
 50: PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_ParMetis(PetscPartitioner);
 51: PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_PTScotch(PetscPartitioner);
 52: PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Chaco(PetscPartitioner);
 53: PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Shell(PetscPartitioner);
 54: PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Simple(PetscPartitioner);
 55: PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Gather(PetscPartitioner);
 56: PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_MatPartitioning(PetscPartitioner);
 58: /*@C
 59:   PetscPartitionerRegisterAll - Registers all of the PetscPartitioner components in the DM package.
 61:   Not Collective
 63:   Input parameter:
 64: . path - The dynamic library path
 66:   Level: advanced
 68: .seealso:  PetscPartitionerRegister(), PetscPartitionerRegisterDestroy()
 69: @*/
 70: PetscErrorCode PetscPartitionerRegisterAll(void)
 71: {
 75:   if (PetscPartitionerRegisterAllCalled) return(0);
 76:   PetscPartitionerRegisterAllCalled = PETSC_TRUE;
 78:   PetscPartitionerRegister(PETSCPARTITIONERPARMETIS, PetscPartitionerCreate_ParMetis);
 79:   PetscPartitionerRegister(PETSCPARTITIONERPTSCOTCH, PetscPartitionerCreate_PTScotch);
 80:   PetscPartitionerRegister(PETSCPARTITIONERCHACO,    PetscPartitionerCreate_Chaco);
 81:   PetscPartitionerRegister(PETSCPARTITIONERSIMPLE,   PetscPartitionerCreate_Simple);
 82:   PetscPartitionerRegister(PETSCPARTITIONERSHELL,    PetscPartitionerCreate_Shell);
 83:   PetscPartitionerRegister(PETSCPARTITIONERGATHER,   PetscPartitionerCreate_Gather);
 84:   PetscPartitionerRegister(PETSCPARTITIONERMATPARTITIONING, PetscPartitionerCreate_MatPartitioning);
 85:   return(0);
 86: }
 88: static PetscBool PetscPartitionerPackageInitialized = PETSC_FALSE;
 90: /*@C
 91:   PetscPartitionerFinalizePackage - This function finalizes everything in the PetscPartitioner package.
 92:   It is called from PetscFinalize().
 94:   Level: developer
 96: .seealso: PetscInitialize()
 97: @*/
 98: PetscErrorCode  PetscPartitionerFinalizePackage(void)
 99: {
103:   PetscFunctionListDestroy(&PetscPartitionerList);
104:   PetscPartitionerPackageInitialized = PETSC_FALSE;
105:   PetscPartitionerRegisterAllCalled  = PETSC_FALSE;
106:   return(0);
107: }
109: /*@C
110:   PetscPartitionerInitializePackage - This function initializes everything in the PetscPartitioner package.
112:   Level: developer
114: .seealso: PetscInitialize()
115: @*/
116: PetscErrorCode  PetscPartitionerInitializePackage(void)
117: {
118:   char           logList[256];
119:   PetscBool      opt,pkg;
123:   if (PetscPartitionerPackageInitialized) return(0);
124:   PetscPartitionerPackageInitialized = PETSC_TRUE;
126:   /* Register Classes */
127:   PetscClassIdRegister("GraphPartitioner",&PETSCPARTITIONER_CLASSID);
128:   /* Register Constructors */
129:   PetscPartitionerRegisterAll();
130:   /* Register Events */
131:   /* Process Info */
132:   {
133:     PetscClassId  classids[1];
135:     classids[0] = PETSCPARTITIONER_CLASSID;
136:     PetscInfoProcessClass("partitioner", 1, classids);
137:   }
138:   /* Process summary exclusions */
139:   PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);
140:   if (opt) {
141:     PetscStrInList("partitioner",logList,',',&pkg);
142:     if (pkg) {PetscLogEventExcludeClass(PETSCPARTITIONER_CLASSID);}
143:   }
144:   /* Register package finalizer */
145:   PetscRegisterFinalize(PetscPartitionerFinalizePackage);
146:   return(0);
147: }