xref: /petsc/src/dm/partitioner/interface/partitionerreg.c (revision 58d68138c660dfb4e9f5b03334792cd4f2ffd7cc)
1 #include <petsc/private/partitionerimpl.h> /*I "petscpartitioner.h" I*/
2 
3 PetscClassId PETSCPARTITIONER_CLASSID = 0;
4 
5 PetscFunctionList PetscPartitionerList              = NULL;
6 PetscBool         PetscPartitionerRegisterAllCalled = PETSC_FALSE;
7 
8 /*@C
9   PetscPartitionerRegister - Adds a new PetscPartitioner implementation
10 
11   Not Collective
12 
13   Input Parameters:
14 + name        - The name of a new user-defined creation routine
15 - create_func - The creation routine itself
16 
17   Notes:
18   PetscPartitionerRegister() may be called multiple times to add several user-defined PetscPartitioners
19 
20   Sample usage:
21 .vb
22     PetscPartitionerRegister("my_part", MyPetscPartitionerCreate);
23 .ve
24 
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
34 
35   Level: advanced
36 
37 .seealso: `PetscPartitionerRegisterAll()`
38 
39 @*/
40 PetscErrorCode PetscPartitionerRegister(const char sname[], PetscErrorCode (*function)(PetscPartitioner)) {
41   PetscFunctionBegin;
42   PetscCall(PetscFunctionListAdd(&PetscPartitionerList, sname, function));
43   PetscFunctionReturn(0);
44 }
45 
46 PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_ParMetis(PetscPartitioner);
47 PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_PTScotch(PetscPartitioner);
48 PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Chaco(PetscPartitioner);
49 PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Shell(PetscPartitioner);
50 PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Simple(PetscPartitioner);
51 PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Gather(PetscPartitioner);
52 PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_MatPartitioning(PetscPartitioner);
53 
54 /*@C
55   PetscPartitionerRegisterAll - Registers all of the PetscPartitioner components in the DM package.
56 
57   Not Collective
58 
59   Input parameter:
60 . path - The dynamic library path
61 
62   Level: advanced
63 
64 .seealso: `PetscPartitionerRegister()`, `PetscPartitionerRegisterDestroy()`
65 @*/
66 PetscErrorCode PetscPartitionerRegisterAll(void) {
67   PetscFunctionBegin;
68   if (PetscPartitionerRegisterAllCalled) PetscFunctionReturn(0);
69   PetscPartitionerRegisterAllCalled = PETSC_TRUE;
70 
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   PetscFunctionReturn(0);
79 }
80 
81 static PetscBool PetscPartitionerPackageInitialized = PETSC_FALSE;
82 
83 /*@C
84   PetscPartitionerFinalizePackage - This function finalizes everything in the PetscPartitioner package.
85   It is called from PetscFinalize().
86 
87   Level: developer
88 
89 .seealso: `PetscInitialize()`
90 @*/
91 PetscErrorCode PetscPartitionerFinalizePackage(void) {
92   PetscFunctionBegin;
93   PetscCall(PetscFunctionListDestroy(&PetscPartitionerList));
94   PetscPartitionerPackageInitialized = PETSC_FALSE;
95   PetscPartitionerRegisterAllCalled  = PETSC_FALSE;
96   PetscFunctionReturn(0);
97 }
98 
99 /*@C
100   PetscPartitionerInitializePackage - This function initializes everything in the PetscPartitioner package.
101 
102   Level: developer
103 
104 .seealso: `PetscInitialize()`
105 @*/
106 PetscErrorCode PetscPartitionerInitializePackage(void) {
107   char      logList[256];
108   PetscBool opt, pkg;
109 
110   PetscFunctionBegin;
111   if (PetscPartitionerPackageInitialized) PetscFunctionReturn(0);
112   PetscPartitionerPackageInitialized = PETSC_TRUE;
113 
114   /* Register Classes */
115   PetscCall(PetscClassIdRegister("GraphPartitioner", &PETSCPARTITIONER_CLASSID));
116   /* Register Constructors */
117   PetscCall(PetscPartitionerRegisterAll());
118   /* Register Events */
119   /* Process Info */
120   {
121     PetscClassId classids[1];
122 
123     classids[0] = PETSCPARTITIONER_CLASSID;
124     PetscCall(PetscInfoProcessClass("partitioner", 1, classids));
125   }
126   /* Process summary exclusions */
127   PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
128   if (opt) {
129     PetscCall(PetscStrInList("partitioner", logList, ',', &pkg));
130     if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCPARTITIONER_CLASSID));
131   }
132   /* Register package finalizer */
133   PetscCall(PetscRegisterFinalize(PetscPartitionerFinalizePackage));
134   PetscFunctionReturn(0);
135 }
136