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: 14*2fe279fdSBarry Smith + sname - The name of a new user-defined creation routine 15*2fe279fdSBarry 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 20abe9303eSLisandro Dalcin Sample 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 Input parameter: 61abe9303eSLisandro Dalcin . path - The dynamic library path 62abe9303eSLisandro Dalcin 63abe9303eSLisandro Dalcin Level: advanced 64abe9303eSLisandro Dalcin 65db781477SPatrick Sanan .seealso: `PetscPartitionerRegister()`, `PetscPartitionerRegisterDestroy()` 66abe9303eSLisandro Dalcin @*/ 67d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerRegisterAll(void) 68d71ae5a4SJacob Faibussowitsch { 69abe9303eSLisandro Dalcin PetscFunctionBegin; 703ba16761SJacob Faibussowitsch if (PetscPartitionerRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS); 71abe9303eSLisandro Dalcin PetscPartitionerRegisterAllCalled = PETSC_TRUE; 72abe9303eSLisandro Dalcin 739566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegister(PETSCPARTITIONERPARMETIS, PetscPartitionerCreate_ParMetis)); 749566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegister(PETSCPARTITIONERPTSCOTCH, PetscPartitionerCreate_PTScotch)); 759566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegister(PETSCPARTITIONERCHACO, PetscPartitionerCreate_Chaco)); 769566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegister(PETSCPARTITIONERSIMPLE, PetscPartitionerCreate_Simple)); 779566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegister(PETSCPARTITIONERSHELL, PetscPartitionerCreate_Shell)); 789566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegister(PETSCPARTITIONERGATHER, PetscPartitionerCreate_Gather)); 799566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegister(PETSCPARTITIONERMATPARTITIONING, PetscPartitionerCreate_MatPartitioning)); 803ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 81abe9303eSLisandro Dalcin } 82abe9303eSLisandro Dalcin 83abe9303eSLisandro Dalcin static PetscBool PetscPartitionerPackageInitialized = PETSC_FALSE; 84abe9303eSLisandro Dalcin 85abe9303eSLisandro Dalcin /*@C 86abe9303eSLisandro Dalcin PetscPartitionerFinalizePackage - This function finalizes everything in the PetscPartitioner package. 87abe9303eSLisandro Dalcin It is called from PetscFinalize(). 88abe9303eSLisandro Dalcin 89abe9303eSLisandro Dalcin Level: developer 90abe9303eSLisandro Dalcin 91db781477SPatrick Sanan .seealso: `PetscInitialize()` 92abe9303eSLisandro Dalcin @*/ 93d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerFinalizePackage(void) 94d71ae5a4SJacob Faibussowitsch { 95abe9303eSLisandro Dalcin PetscFunctionBegin; 969566063dSJacob Faibussowitsch PetscCall(PetscFunctionListDestroy(&PetscPartitionerList)); 97abe9303eSLisandro Dalcin PetscPartitionerPackageInitialized = PETSC_FALSE; 98abe9303eSLisandro Dalcin PetscPartitionerRegisterAllCalled = PETSC_FALSE; 993ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 100abe9303eSLisandro Dalcin } 101abe9303eSLisandro Dalcin 102abe9303eSLisandro Dalcin /*@C 103abe9303eSLisandro Dalcin PetscPartitionerInitializePackage - This function initializes everything in the PetscPartitioner package. 104abe9303eSLisandro Dalcin 105abe9303eSLisandro Dalcin Level: developer 106abe9303eSLisandro Dalcin 107db781477SPatrick Sanan .seealso: `PetscInitialize()` 108abe9303eSLisandro Dalcin @*/ 109d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerInitializePackage(void) 110d71ae5a4SJacob Faibussowitsch { 111abe9303eSLisandro Dalcin char logList[256]; 112abe9303eSLisandro Dalcin PetscBool opt, pkg; 113abe9303eSLisandro Dalcin 114abe9303eSLisandro Dalcin PetscFunctionBegin; 1153ba16761SJacob Faibussowitsch if (PetscPartitionerPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS); 116abe9303eSLisandro Dalcin PetscPartitionerPackageInitialized = PETSC_TRUE; 117abe9303eSLisandro Dalcin 118abe9303eSLisandro Dalcin /* Register Classes */ 1199566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("GraphPartitioner", &PETSCPARTITIONER_CLASSID)); 120abe9303eSLisandro Dalcin /* Register Constructors */ 1219566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegisterAll()); 122abe9303eSLisandro Dalcin /* Register Events */ 123abe9303eSLisandro Dalcin /* Process Info */ 124abe9303eSLisandro Dalcin { 125abe9303eSLisandro Dalcin PetscClassId classids[1]; 126abe9303eSLisandro Dalcin 127abe9303eSLisandro Dalcin classids[0] = PETSCPARTITIONER_CLASSID; 1289566063dSJacob Faibussowitsch PetscCall(PetscInfoProcessClass("partitioner", 1, classids)); 129abe9303eSLisandro Dalcin } 130abe9303eSLisandro Dalcin /* Process summary exclusions */ 1319566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt)); 132abe9303eSLisandro Dalcin if (opt) { 1339566063dSJacob Faibussowitsch PetscCall(PetscStrInList("partitioner", logList, ',', &pkg)); 1349566063dSJacob Faibussowitsch if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCPARTITIONER_CLASSID)); 135abe9303eSLisandro Dalcin } 136abe9303eSLisandro Dalcin /* Register package finalizer */ 1379566063dSJacob Faibussowitsch PetscCall(PetscRegisterFinalize(PetscPartitionerFinalizePackage)); 1383ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 139abe9303eSLisandro Dalcin } 140