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