1abe9303eSLisandro Dalcin #include <petsc/private/partitionerimpl.h> /*I "petscpartitioner.h" I*/ 2abe9303eSLisandro Dalcin 3abe9303eSLisandro Dalcin PetscClassId PETSCPARTITIONER_CLASSID = 0; 4abe9303eSLisandro Dalcin 5abe9303eSLisandro Dalcin PetscFunctionList PetscPartitionerList = NULL; 6abe9303eSLisandro Dalcin PetscBool PetscPartitionerRegisterAllCalled = PETSC_FALSE; 7abe9303eSLisandro Dalcin 8abe9303eSLisandro Dalcin /*@C 9abe9303eSLisandro Dalcin PetscPartitionerRegister - Adds a new PetscPartitioner implementation 10abe9303eSLisandro Dalcin 11abe9303eSLisandro Dalcin Not Collective 12abe9303eSLisandro Dalcin 13abe9303eSLisandro Dalcin Input Parameters: 142fe279fdSBarry Smith + sname - The name of a new user-defined creation routine 152fe279fdSBarry Smith - function - The creation routine 16abe9303eSLisandro Dalcin 17abe9303eSLisandro Dalcin Notes: 18abe9303eSLisandro Dalcin PetscPartitionerRegister() may be called multiple times to add several user-defined PetscPartitioners 19abe9303eSLisandro Dalcin 20*60225df5SJacob Faibussowitsch Example Usage: 21abe9303eSLisandro Dalcin .vb 22abe9303eSLisandro Dalcin PetscPartitionerRegister("my_part", MyPetscPartitionerCreate); 23abe9303eSLisandro Dalcin .ve 24abe9303eSLisandro Dalcin 25abe9303eSLisandro Dalcin Then, your PetscPartitioner type can be chosen with the procedural interface via 26abe9303eSLisandro Dalcin .vb 27abe9303eSLisandro Dalcin PetscPartitionerCreate(MPI_Comm, PetscPartitioner *); 28abe9303eSLisandro Dalcin PetscPartitionerSetType(PetscPartitioner, "my_part"); 29abe9303eSLisandro Dalcin .ve 30abe9303eSLisandro Dalcin or at runtime via the option 31abe9303eSLisandro Dalcin .vb 32abe9303eSLisandro Dalcin -petscpartitioner_type my_part 33abe9303eSLisandro Dalcin .ve 34abe9303eSLisandro Dalcin 35abe9303eSLisandro Dalcin Level: advanced 36abe9303eSLisandro Dalcin 37db781477SPatrick Sanan .seealso: `PetscPartitionerRegisterAll()` 38abe9303eSLisandro Dalcin 39abe9303eSLisandro Dalcin @*/ 40d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerRegister(const char sname[], PetscErrorCode (*function)(PetscPartitioner)) 41d71ae5a4SJacob Faibussowitsch { 42abe9303eSLisandro Dalcin PetscFunctionBegin; 439566063dSJacob Faibussowitsch PetscCall(PetscFunctionListAdd(&PetscPartitionerList, sname, function)); 443ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 45abe9303eSLisandro Dalcin } 46abe9303eSLisandro Dalcin 47abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_ParMetis(PetscPartitioner); 48abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_PTScotch(PetscPartitioner); 49abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Chaco(PetscPartitioner); 50abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Shell(PetscPartitioner); 51abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Simple(PetscPartitioner); 52abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Gather(PetscPartitioner); 53abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_MatPartitioning(PetscPartitioner); 54abe9303eSLisandro Dalcin 55abe9303eSLisandro Dalcin /*@C 56abe9303eSLisandro Dalcin PetscPartitionerRegisterAll - Registers all of the PetscPartitioner components in the DM package. 57abe9303eSLisandro Dalcin 58abe9303eSLisandro Dalcin Not Collective 59abe9303eSLisandro Dalcin 60abe9303eSLisandro Dalcin Level: advanced 61abe9303eSLisandro Dalcin 62db781477SPatrick Sanan .seealso: `PetscPartitionerRegister()`, `PetscPartitionerRegisterDestroy()` 63abe9303eSLisandro Dalcin @*/ 64d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerRegisterAll(void) 65d71ae5a4SJacob Faibussowitsch { 66abe9303eSLisandro Dalcin PetscFunctionBegin; 673ba16761SJacob Faibussowitsch if (PetscPartitionerRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS); 68abe9303eSLisandro Dalcin PetscPartitionerRegisterAllCalled = PETSC_TRUE; 69abe9303eSLisandro Dalcin 709566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegister(PETSCPARTITIONERPARMETIS, PetscPartitionerCreate_ParMetis)); 719566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegister(PETSCPARTITIONERPTSCOTCH, PetscPartitionerCreate_PTScotch)); 729566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegister(PETSCPARTITIONERCHACO, PetscPartitionerCreate_Chaco)); 739566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegister(PETSCPARTITIONERSIMPLE, PetscPartitionerCreate_Simple)); 749566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegister(PETSCPARTITIONERSHELL, PetscPartitionerCreate_Shell)); 759566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegister(PETSCPARTITIONERGATHER, PetscPartitionerCreate_Gather)); 769566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegister(PETSCPARTITIONERMATPARTITIONING, PetscPartitionerCreate_MatPartitioning)); 773ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 78abe9303eSLisandro Dalcin } 79abe9303eSLisandro Dalcin 80abe9303eSLisandro Dalcin static PetscBool PetscPartitionerPackageInitialized = PETSC_FALSE; 81abe9303eSLisandro Dalcin 82abe9303eSLisandro Dalcin /*@C 83abe9303eSLisandro Dalcin PetscPartitionerFinalizePackage - This function finalizes everything in the PetscPartitioner package. 84abe9303eSLisandro Dalcin It is called from PetscFinalize(). 85abe9303eSLisandro Dalcin 86abe9303eSLisandro Dalcin Level: developer 87abe9303eSLisandro Dalcin 88db781477SPatrick Sanan .seealso: `PetscInitialize()` 89abe9303eSLisandro Dalcin @*/ 90d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerFinalizePackage(void) 91d71ae5a4SJacob Faibussowitsch { 92abe9303eSLisandro Dalcin PetscFunctionBegin; 939566063dSJacob Faibussowitsch PetscCall(PetscFunctionListDestroy(&PetscPartitionerList)); 94abe9303eSLisandro Dalcin PetscPartitionerPackageInitialized = PETSC_FALSE; 95abe9303eSLisandro Dalcin PetscPartitionerRegisterAllCalled = PETSC_FALSE; 963ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 97abe9303eSLisandro Dalcin } 98abe9303eSLisandro Dalcin 99abe9303eSLisandro Dalcin /*@C 100abe9303eSLisandro Dalcin PetscPartitionerInitializePackage - This function initializes everything in the PetscPartitioner package. 101abe9303eSLisandro Dalcin 102abe9303eSLisandro Dalcin Level: developer 103abe9303eSLisandro Dalcin 104db781477SPatrick Sanan .seealso: `PetscInitialize()` 105abe9303eSLisandro Dalcin @*/ 106d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerInitializePackage(void) 107d71ae5a4SJacob Faibussowitsch { 108abe9303eSLisandro Dalcin char logList[256]; 109abe9303eSLisandro Dalcin PetscBool opt, pkg; 110abe9303eSLisandro Dalcin 111abe9303eSLisandro Dalcin PetscFunctionBegin; 1123ba16761SJacob Faibussowitsch if (PetscPartitionerPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS); 113abe9303eSLisandro Dalcin PetscPartitionerPackageInitialized = PETSC_TRUE; 114abe9303eSLisandro Dalcin 115abe9303eSLisandro Dalcin /* Register Classes */ 1169566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("GraphPartitioner", &PETSCPARTITIONER_CLASSID)); 117abe9303eSLisandro Dalcin /* Register Constructors */ 1189566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegisterAll()); 119abe9303eSLisandro Dalcin /* Register Events */ 120abe9303eSLisandro Dalcin /* Process Info */ 121abe9303eSLisandro Dalcin { 122abe9303eSLisandro Dalcin PetscClassId classids[1]; 123abe9303eSLisandro Dalcin 124abe9303eSLisandro Dalcin classids[0] = PETSCPARTITIONER_CLASSID; 1259566063dSJacob Faibussowitsch PetscCall(PetscInfoProcessClass("partitioner", 1, classids)); 126abe9303eSLisandro Dalcin } 127abe9303eSLisandro Dalcin /* Process summary exclusions */ 1289566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt)); 129abe9303eSLisandro Dalcin if (opt) { 1309566063dSJacob Faibussowitsch PetscCall(PetscStrInList("partitioner", logList, ',', &pkg)); 1319566063dSJacob Faibussowitsch if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCPARTITIONER_CLASSID)); 132abe9303eSLisandro Dalcin } 133abe9303eSLisandro Dalcin /* Register package finalizer */ 1349566063dSJacob Faibussowitsch PetscCall(PetscRegisterFinalize(PetscPartitionerFinalizePackage)); 1353ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 136abe9303eSLisandro Dalcin } 137