xref: /petsc/src/dm/partitioner/interface/partitionerreg.c (revision 237137dc2c36cd704ae82eca1d03b531ce3d02f9)
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, No Fortran Support
12 
13   Input Parameters:
14 + sname    - The name of a new user-defined creation routine
15 - function - The creation routine
16 
17   Notes:
18   PetscPartitionerRegister() may be called multiple times to add several user-defined PetscPartitioners
19 
20   Example 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 @*/
PetscPartitionerRegister(const char sname[],PetscErrorCode (* function)(PetscPartitioner))40 PetscErrorCode PetscPartitionerRegister(const char sname[], PetscErrorCode (*function)(PetscPartitioner))
41 {
42   PetscFunctionBegin;
43   PetscCall(PetscFunctionListAdd(&PetscPartitionerList, sname, function));
44   PetscFunctionReturn(PETSC_SUCCESS);
45 }
46 
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);
55 
56 /*@C
57   PetscPartitionerRegisterAll - Registers all of the PetscPartitioner components in the DM package.
58 
59   Not Collective
60 
61   Level: advanced
62 
63 .seealso: `PetscPartitionerRegister()`, `PetscPartitionerRegisterDestroy()`
64 @*/
PetscPartitionerRegisterAll(void)65 PetscErrorCode PetscPartitionerRegisterAll(void)
66 {
67   PetscFunctionBegin;
68   if (PetscPartitionerRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS);
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   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERMULTISTAGE, PetscPartitionerCreate_Multistage));
79   PetscFunctionReturn(PETSC_SUCCESS);
80 }
81 
82 static PetscBool PetscPartitionerPackageInitialized = PETSC_FALSE;
83 
84 /*@C
85   PetscPartitionerFinalizePackage - This function finalizes everything in the PetscPartitioner package.
86   It is called from PetscFinalize().
87 
88   Level: developer
89 
90 .seealso: `PetscInitialize()`
91 @*/
PetscPartitionerFinalizePackage(void)92 PetscErrorCode PetscPartitionerFinalizePackage(void)
93 {
94   PetscFunctionBegin;
95   PetscCall(PetscFunctionListDestroy(&PetscPartitionerList));
96   PetscPartitionerPackageInitialized = PETSC_FALSE;
97   PetscPartitionerRegisterAllCalled  = PETSC_FALSE;
98   PetscFunctionReturn(PETSC_SUCCESS);
99 }
100 
101 /*@C
102   PetscPartitionerInitializePackage - This function initializes everything in the PetscPartitioner package.
103 
104   Level: developer
105 
106 .seealso: `PetscInitialize()`
107 @*/
PetscPartitionerInitializePackage(void)108 PetscErrorCode PetscPartitionerInitializePackage(void)
109 {
110   char      logList[256];
111   PetscBool opt, pkg;
112 
113   PetscFunctionBegin;
114   if (PetscPartitionerPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
115   PetscPartitionerPackageInitialized = PETSC_TRUE;
116 
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];
126 
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];
134 
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 }
148