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