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