Actual source code: partitionerreg.c
petsc-3.14.6 2021-03-30
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: }