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