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