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