xref: /petsc/src/dm/partitioner/interface/partitionerreg.c (revision 237137dc2c36cd704ae82eca1d03b531ce3d02f9)
1abe9303eSLisandro Dalcin #include <petsc/private/partitionerimpl.h> /*I "petscpartitioner.h" I*/
2abe9303eSLisandro Dalcin 
3abe9303eSLisandro Dalcin PetscClassId PETSCPARTITIONER_CLASSID = 0;
4abe9303eSLisandro Dalcin 
5abe9303eSLisandro Dalcin PetscFunctionList PetscPartitionerList              = NULL;
6abe9303eSLisandro Dalcin PetscBool         PetscPartitionerRegisterAllCalled = PETSC_FALSE;
7abe9303eSLisandro Dalcin 
8abe9303eSLisandro Dalcin /*@C
9abe9303eSLisandro Dalcin   PetscPartitionerRegister - Adds a new PetscPartitioner implementation
10abe9303eSLisandro Dalcin 
11cc4c1da9SBarry Smith   Not Collective, No Fortran Support
12abe9303eSLisandro Dalcin 
13abe9303eSLisandro Dalcin   Input Parameters:
142fe279fdSBarry Smith + sname    - The name of a new user-defined creation routine
152fe279fdSBarry Smith - function - The creation routine
16abe9303eSLisandro Dalcin 
17abe9303eSLisandro Dalcin   Notes:
18abe9303eSLisandro Dalcin   PetscPartitionerRegister() may be called multiple times to add several user-defined PetscPartitioners
19abe9303eSLisandro Dalcin 
2060225df5SJacob Faibussowitsch   Example Usage:
21abe9303eSLisandro Dalcin .vb
22abe9303eSLisandro Dalcin     PetscPartitionerRegister("my_part", MyPetscPartitionerCreate);
23abe9303eSLisandro Dalcin .ve
24abe9303eSLisandro Dalcin 
25abe9303eSLisandro Dalcin   Then, your PetscPartitioner type can be chosen with the procedural interface via
26abe9303eSLisandro Dalcin .vb
27abe9303eSLisandro Dalcin     PetscPartitionerCreate(MPI_Comm, PetscPartitioner *);
28abe9303eSLisandro Dalcin     PetscPartitionerSetType(PetscPartitioner, "my_part");
29abe9303eSLisandro Dalcin .ve
30abe9303eSLisandro Dalcin   or at runtime via the option
31abe9303eSLisandro Dalcin .vb
32abe9303eSLisandro Dalcin     -petscpartitioner_type my_part
33abe9303eSLisandro Dalcin .ve
34abe9303eSLisandro Dalcin 
35abe9303eSLisandro Dalcin   Level: advanced
36abe9303eSLisandro Dalcin 
37db781477SPatrick Sanan .seealso: `PetscPartitionerRegisterAll()`
38abe9303eSLisandro Dalcin 
39abe9303eSLisandro Dalcin @*/
PetscPartitionerRegister(const char sname[],PetscErrorCode (* function)(PetscPartitioner))40d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerRegister(const char sname[], PetscErrorCode (*function)(PetscPartitioner))
41d71ae5a4SJacob Faibussowitsch {
42abe9303eSLisandro Dalcin   PetscFunctionBegin;
439566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListAdd(&PetscPartitionerList, sname, function));
443ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
45abe9303eSLisandro Dalcin }
46abe9303eSLisandro Dalcin 
47*3b9d9b65SStefano Zampini PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Multistage(PetscPartitioner);
48abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_ParMetis(PetscPartitioner);
49abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_PTScotch(PetscPartitioner);
50abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Chaco(PetscPartitioner);
51abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Shell(PetscPartitioner);
52abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Simple(PetscPartitioner);
53abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Gather(PetscPartitioner);
54abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_MatPartitioning(PetscPartitioner);
55abe9303eSLisandro Dalcin 
56abe9303eSLisandro Dalcin /*@C
57abe9303eSLisandro Dalcin   PetscPartitionerRegisterAll - Registers all of the PetscPartitioner components in the DM package.
58abe9303eSLisandro Dalcin 
59abe9303eSLisandro Dalcin   Not Collective
60abe9303eSLisandro Dalcin 
61abe9303eSLisandro Dalcin   Level: advanced
62abe9303eSLisandro Dalcin 
63db781477SPatrick Sanan .seealso: `PetscPartitionerRegister()`, `PetscPartitionerRegisterDestroy()`
64abe9303eSLisandro Dalcin @*/
PetscPartitionerRegisterAll(void)65d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerRegisterAll(void)
66d71ae5a4SJacob Faibussowitsch {
67abe9303eSLisandro Dalcin   PetscFunctionBegin;
683ba16761SJacob Faibussowitsch   if (PetscPartitionerRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS);
69abe9303eSLisandro Dalcin   PetscPartitionerRegisterAllCalled = PETSC_TRUE;
70abe9303eSLisandro Dalcin 
719566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERPARMETIS, PetscPartitionerCreate_ParMetis));
729566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERPTSCOTCH, PetscPartitionerCreate_PTScotch));
739566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERCHACO, PetscPartitionerCreate_Chaco));
749566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERSIMPLE, PetscPartitionerCreate_Simple));
759566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERSHELL, PetscPartitionerCreate_Shell));
769566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERGATHER, PetscPartitionerCreate_Gather));
779566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERMATPARTITIONING, PetscPartitionerCreate_MatPartitioning));
78*3b9d9b65SStefano Zampini   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERMULTISTAGE, PetscPartitionerCreate_Multistage));
793ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
80abe9303eSLisandro Dalcin }
81abe9303eSLisandro Dalcin 
82abe9303eSLisandro Dalcin static PetscBool PetscPartitionerPackageInitialized = PETSC_FALSE;
83abe9303eSLisandro Dalcin 
84abe9303eSLisandro Dalcin /*@C
85abe9303eSLisandro Dalcin   PetscPartitionerFinalizePackage - This function finalizes everything in the PetscPartitioner package.
86abe9303eSLisandro Dalcin   It is called from PetscFinalize().
87abe9303eSLisandro Dalcin 
88abe9303eSLisandro Dalcin   Level: developer
89abe9303eSLisandro Dalcin 
90db781477SPatrick Sanan .seealso: `PetscInitialize()`
91abe9303eSLisandro Dalcin @*/
PetscPartitionerFinalizePackage(void)92d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerFinalizePackage(void)
93d71ae5a4SJacob Faibussowitsch {
94abe9303eSLisandro Dalcin   PetscFunctionBegin;
959566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListDestroy(&PetscPartitionerList));
96abe9303eSLisandro Dalcin   PetscPartitionerPackageInitialized = PETSC_FALSE;
97abe9303eSLisandro Dalcin   PetscPartitionerRegisterAllCalled  = PETSC_FALSE;
983ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
99abe9303eSLisandro Dalcin }
100abe9303eSLisandro Dalcin 
101abe9303eSLisandro Dalcin /*@C
102abe9303eSLisandro Dalcin   PetscPartitionerInitializePackage - This function initializes everything in the PetscPartitioner package.
103abe9303eSLisandro Dalcin 
104abe9303eSLisandro Dalcin   Level: developer
105abe9303eSLisandro Dalcin 
106db781477SPatrick Sanan .seealso: `PetscInitialize()`
107abe9303eSLisandro Dalcin @*/
PetscPartitionerInitializePackage(void)108d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerInitializePackage(void)
109d71ae5a4SJacob Faibussowitsch {
110abe9303eSLisandro Dalcin   char      logList[256];
111abe9303eSLisandro Dalcin   PetscBool opt, pkg;
112abe9303eSLisandro Dalcin 
113abe9303eSLisandro Dalcin   PetscFunctionBegin;
1143ba16761SJacob Faibussowitsch   if (PetscPartitionerPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
115abe9303eSLisandro Dalcin   PetscPartitionerPackageInitialized = PETSC_TRUE;
116abe9303eSLisandro Dalcin 
117abe9303eSLisandro Dalcin   /* Register Classes */
1189566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("GraphPartitioner", &PETSCPARTITIONER_CLASSID));
119abe9303eSLisandro Dalcin   /* Register Constructors */
1209566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerRegisterAll());
121abe9303eSLisandro Dalcin   /* Register Events */
122*3b9d9b65SStefano Zampini   {
123*3b9d9b65SStefano Zampini     PetscCall(PetscLogEventRegister("PartMSSetUp", PETSCPARTITIONER_CLASSID, &PetscPartitioner_MS_SetUp));
124*3b9d9b65SStefano Zampini     for (PetscInt event = 0; event < PETSCPARTITIONER_MS_NUMSTAGE; event++) {
125*3b9d9b65SStefano Zampini       char ename[32];
126*3b9d9b65SStefano Zampini 
127*3b9d9b65SStefano Zampini       PetscCall(PetscSNPrintf(ename, sizeof(ename), "PartMSStage %" PetscInt_FMT, event));
128*3b9d9b65SStefano Zampini       PetscCall(PetscLogEventRegister(ename, PETSCPARTITIONER_CLASSID, &PetscPartitioner_MS_Stage[event]));
129*3b9d9b65SStefano Zampini     }
130*3b9d9b65SStefano Zampini   }
131abe9303eSLisandro Dalcin   /* Process Info */
132abe9303eSLisandro Dalcin   {
133abe9303eSLisandro Dalcin     PetscClassId classids[1];
134abe9303eSLisandro Dalcin 
135abe9303eSLisandro Dalcin     classids[0] = PETSCPARTITIONER_CLASSID;
1369566063dSJacob Faibussowitsch     PetscCall(PetscInfoProcessClass("partitioner", 1, classids));
137abe9303eSLisandro Dalcin   }
138abe9303eSLisandro Dalcin   /* Process summary exclusions */
1399566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
140abe9303eSLisandro Dalcin   if (opt) {
1419566063dSJacob Faibussowitsch     PetscCall(PetscStrInList("partitioner", logList, ',', &pkg));
1429566063dSJacob Faibussowitsch     if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCPARTITIONER_CLASSID));
143abe9303eSLisandro Dalcin   }
144abe9303eSLisandro Dalcin   /* Register package finalizer */
1459566063dSJacob Faibussowitsch   PetscCall(PetscRegisterFinalize(PetscPartitionerFinalizePackage));
1463ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
147abe9303eSLisandro Dalcin }
148