xref: /petsc/src/dm/partitioner/interface/partitionerreg.c (revision 2fe279fdf3e687a416e4eadb7d3c7a82d60442c6)
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 
11abe9303eSLisandro Dalcin   Not Collective
12abe9303eSLisandro Dalcin 
13abe9303eSLisandro Dalcin   Input Parameters:
14*2fe279fdSBarry Smith + sname - The name of a new user-defined creation routine
15*2fe279fdSBarry 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 
20abe9303eSLisandro Dalcin   Sample 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 @*/
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 
47abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_ParMetis(PetscPartitioner);
48abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_PTScotch(PetscPartitioner);
49abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Chaco(PetscPartitioner);
50abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Shell(PetscPartitioner);
51abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Simple(PetscPartitioner);
52abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Gather(PetscPartitioner);
53abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_MatPartitioning(PetscPartitioner);
54abe9303eSLisandro Dalcin 
55abe9303eSLisandro Dalcin /*@C
56abe9303eSLisandro Dalcin   PetscPartitionerRegisterAll - Registers all of the PetscPartitioner components in the DM package.
57abe9303eSLisandro Dalcin 
58abe9303eSLisandro Dalcin   Not Collective
59abe9303eSLisandro Dalcin 
60abe9303eSLisandro Dalcin   Input parameter:
61abe9303eSLisandro Dalcin . path - The dynamic library path
62abe9303eSLisandro Dalcin 
63abe9303eSLisandro Dalcin   Level: advanced
64abe9303eSLisandro Dalcin 
65db781477SPatrick Sanan .seealso: `PetscPartitionerRegister()`, `PetscPartitionerRegisterDestroy()`
66abe9303eSLisandro Dalcin @*/
67d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerRegisterAll(void)
68d71ae5a4SJacob Faibussowitsch {
69abe9303eSLisandro Dalcin   PetscFunctionBegin;
703ba16761SJacob Faibussowitsch   if (PetscPartitionerRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS);
71abe9303eSLisandro Dalcin   PetscPartitionerRegisterAllCalled = PETSC_TRUE;
72abe9303eSLisandro Dalcin 
739566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERPARMETIS, PetscPartitionerCreate_ParMetis));
749566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERPTSCOTCH, PetscPartitionerCreate_PTScotch));
759566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERCHACO, PetscPartitionerCreate_Chaco));
769566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERSIMPLE, PetscPartitionerCreate_Simple));
779566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERSHELL, PetscPartitionerCreate_Shell));
789566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERGATHER, PetscPartitionerCreate_Gather));
799566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerRegister(PETSCPARTITIONERMATPARTITIONING, PetscPartitionerCreate_MatPartitioning));
803ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
81abe9303eSLisandro Dalcin }
82abe9303eSLisandro Dalcin 
83abe9303eSLisandro Dalcin static PetscBool PetscPartitionerPackageInitialized = PETSC_FALSE;
84abe9303eSLisandro Dalcin 
85abe9303eSLisandro Dalcin /*@C
86abe9303eSLisandro Dalcin   PetscPartitionerFinalizePackage - This function finalizes everything in the PetscPartitioner package.
87abe9303eSLisandro Dalcin   It is called from PetscFinalize().
88abe9303eSLisandro Dalcin 
89abe9303eSLisandro Dalcin   Level: developer
90abe9303eSLisandro Dalcin 
91db781477SPatrick Sanan .seealso: `PetscInitialize()`
92abe9303eSLisandro Dalcin @*/
93d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerFinalizePackage(void)
94d71ae5a4SJacob Faibussowitsch {
95abe9303eSLisandro Dalcin   PetscFunctionBegin;
969566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListDestroy(&PetscPartitionerList));
97abe9303eSLisandro Dalcin   PetscPartitionerPackageInitialized = PETSC_FALSE;
98abe9303eSLisandro Dalcin   PetscPartitionerRegisterAllCalled  = PETSC_FALSE;
993ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
100abe9303eSLisandro Dalcin }
101abe9303eSLisandro Dalcin 
102abe9303eSLisandro Dalcin /*@C
103abe9303eSLisandro Dalcin   PetscPartitionerInitializePackage - This function initializes everything in the PetscPartitioner package.
104abe9303eSLisandro Dalcin 
105abe9303eSLisandro Dalcin   Level: developer
106abe9303eSLisandro Dalcin 
107db781477SPatrick Sanan .seealso: `PetscInitialize()`
108abe9303eSLisandro Dalcin @*/
109d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerInitializePackage(void)
110d71ae5a4SJacob Faibussowitsch {
111abe9303eSLisandro Dalcin   char      logList[256];
112abe9303eSLisandro Dalcin   PetscBool opt, pkg;
113abe9303eSLisandro Dalcin 
114abe9303eSLisandro Dalcin   PetscFunctionBegin;
1153ba16761SJacob Faibussowitsch   if (PetscPartitionerPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
116abe9303eSLisandro Dalcin   PetscPartitionerPackageInitialized = PETSC_TRUE;
117abe9303eSLisandro Dalcin 
118abe9303eSLisandro Dalcin   /* Register Classes */
1199566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("GraphPartitioner", &PETSCPARTITIONER_CLASSID));
120abe9303eSLisandro Dalcin   /* Register Constructors */
1219566063dSJacob Faibussowitsch   PetscCall(PetscPartitionerRegisterAll());
122abe9303eSLisandro Dalcin   /* Register Events */
123abe9303eSLisandro Dalcin   /* Process Info */
124abe9303eSLisandro Dalcin   {
125abe9303eSLisandro Dalcin     PetscClassId classids[1];
126abe9303eSLisandro Dalcin 
127abe9303eSLisandro Dalcin     classids[0] = PETSCPARTITIONER_CLASSID;
1289566063dSJacob Faibussowitsch     PetscCall(PetscInfoProcessClass("partitioner", 1, classids));
129abe9303eSLisandro Dalcin   }
130abe9303eSLisandro Dalcin   /* Process summary exclusions */
1319566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
132abe9303eSLisandro Dalcin   if (opt) {
1339566063dSJacob Faibussowitsch     PetscCall(PetscStrInList("partitioner", logList, ',', &pkg));
1349566063dSJacob Faibussowitsch     if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCPARTITIONER_CLASSID));
135abe9303eSLisandro Dalcin   }
136abe9303eSLisandro Dalcin   /* Register package finalizer */
1379566063dSJacob Faibussowitsch   PetscCall(PetscRegisterFinalize(PetscPartitionerFinalizePackage));
1383ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
139abe9303eSLisandro Dalcin }
140