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 11cc4c1da9SBarry Smith Not Collective, No Fortran Support 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 2060225df5SJacob 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 47*3b9d9b65SStefano Zampini PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Multistage(PetscPartitioner); 48abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_ParMetis(PetscPartitioner); 49abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_PTScotch(PetscPartitioner); 50abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Chaco(PetscPartitioner); 51abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Shell(PetscPartitioner); 52abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Simple(PetscPartitioner); 53abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_Gather(PetscPartitioner); 54abe9303eSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscPartitionerCreate_MatPartitioning(PetscPartitioner); 55abe9303eSLisandro Dalcin 56abe9303eSLisandro Dalcin /*@C 57abe9303eSLisandro Dalcin PetscPartitionerRegisterAll - Registers all of the PetscPartitioner components in the DM package. 58abe9303eSLisandro Dalcin 59abe9303eSLisandro Dalcin Not Collective 60abe9303eSLisandro Dalcin 61abe9303eSLisandro Dalcin Level: advanced 62abe9303eSLisandro Dalcin 63db781477SPatrick Sanan .seealso: `PetscPartitionerRegister()`, `PetscPartitionerRegisterDestroy()` 64abe9303eSLisandro Dalcin @*/ 65d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerRegisterAll(void) 66d71ae5a4SJacob Faibussowitsch { 67abe9303eSLisandro Dalcin PetscFunctionBegin; 683ba16761SJacob Faibussowitsch if (PetscPartitionerRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS); 69abe9303eSLisandro Dalcin PetscPartitionerRegisterAllCalled = PETSC_TRUE; 70abe9303eSLisandro Dalcin 719566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegister(PETSCPARTITIONERPARMETIS, PetscPartitionerCreate_ParMetis)); 729566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegister(PETSCPARTITIONERPTSCOTCH, PetscPartitionerCreate_PTScotch)); 739566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegister(PETSCPARTITIONERCHACO, PetscPartitionerCreate_Chaco)); 749566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegister(PETSCPARTITIONERSIMPLE, PetscPartitionerCreate_Simple)); 759566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegister(PETSCPARTITIONERSHELL, PetscPartitionerCreate_Shell)); 769566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegister(PETSCPARTITIONERGATHER, PetscPartitionerCreate_Gather)); 779566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegister(PETSCPARTITIONERMATPARTITIONING, PetscPartitionerCreate_MatPartitioning)); 78*3b9d9b65SStefano Zampini PetscCall(PetscPartitionerRegister(PETSCPARTITIONERMULTISTAGE, PetscPartitionerCreate_Multistage)); 793ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 80abe9303eSLisandro Dalcin } 81abe9303eSLisandro Dalcin 82abe9303eSLisandro Dalcin static PetscBool PetscPartitionerPackageInitialized = PETSC_FALSE; 83abe9303eSLisandro Dalcin 84abe9303eSLisandro Dalcin /*@C 85abe9303eSLisandro Dalcin PetscPartitionerFinalizePackage - This function finalizes everything in the PetscPartitioner package. 86abe9303eSLisandro Dalcin It is called from PetscFinalize(). 87abe9303eSLisandro Dalcin 88abe9303eSLisandro Dalcin Level: developer 89abe9303eSLisandro Dalcin 90db781477SPatrick Sanan .seealso: `PetscInitialize()` 91abe9303eSLisandro Dalcin @*/ 92d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerFinalizePackage(void) 93d71ae5a4SJacob Faibussowitsch { 94abe9303eSLisandro Dalcin PetscFunctionBegin; 959566063dSJacob Faibussowitsch PetscCall(PetscFunctionListDestroy(&PetscPartitionerList)); 96abe9303eSLisandro Dalcin PetscPartitionerPackageInitialized = PETSC_FALSE; 97abe9303eSLisandro Dalcin PetscPartitionerRegisterAllCalled = PETSC_FALSE; 983ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 99abe9303eSLisandro Dalcin } 100abe9303eSLisandro Dalcin 101abe9303eSLisandro Dalcin /*@C 102abe9303eSLisandro Dalcin PetscPartitionerInitializePackage - This function initializes everything in the PetscPartitioner package. 103abe9303eSLisandro Dalcin 104abe9303eSLisandro Dalcin Level: developer 105abe9303eSLisandro Dalcin 106db781477SPatrick Sanan .seealso: `PetscInitialize()` 107abe9303eSLisandro Dalcin @*/ 108d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPartitionerInitializePackage(void) 109d71ae5a4SJacob Faibussowitsch { 110abe9303eSLisandro Dalcin char logList[256]; 111abe9303eSLisandro Dalcin PetscBool opt, pkg; 112abe9303eSLisandro Dalcin 113abe9303eSLisandro Dalcin PetscFunctionBegin; 1143ba16761SJacob Faibussowitsch if (PetscPartitionerPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS); 115abe9303eSLisandro Dalcin PetscPartitionerPackageInitialized = PETSC_TRUE; 116abe9303eSLisandro Dalcin 117abe9303eSLisandro Dalcin /* Register Classes */ 1189566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("GraphPartitioner", &PETSCPARTITIONER_CLASSID)); 119abe9303eSLisandro Dalcin /* Register Constructors */ 1209566063dSJacob Faibussowitsch PetscCall(PetscPartitionerRegisterAll()); 121abe9303eSLisandro Dalcin /* Register Events */ 122*3b9d9b65SStefano Zampini { 123*3b9d9b65SStefano Zampini PetscCall(PetscLogEventRegister("PartMSSetUp", PETSCPARTITIONER_CLASSID, &PetscPartitioner_MS_SetUp)); 124*3b9d9b65SStefano Zampini for (PetscInt event = 0; event < PETSCPARTITIONER_MS_NUMSTAGE; event++) { 125*3b9d9b65SStefano Zampini char ename[32]; 126*3b9d9b65SStefano Zampini 127*3b9d9b65SStefano Zampini PetscCall(PetscSNPrintf(ename, sizeof(ename), "PartMSStage %" PetscInt_FMT, event)); 128*3b9d9b65SStefano Zampini PetscCall(PetscLogEventRegister(ename, PETSCPARTITIONER_CLASSID, &PetscPartitioner_MS_Stage[event])); 129*3b9d9b65SStefano Zampini } 130*3b9d9b65SStefano Zampini } 131abe9303eSLisandro Dalcin /* Process Info */ 132abe9303eSLisandro Dalcin { 133abe9303eSLisandro Dalcin PetscClassId classids[1]; 134abe9303eSLisandro Dalcin 135abe9303eSLisandro Dalcin classids[0] = PETSCPARTITIONER_CLASSID; 1369566063dSJacob Faibussowitsch PetscCall(PetscInfoProcessClass("partitioner", 1, classids)); 137abe9303eSLisandro Dalcin } 138abe9303eSLisandro Dalcin /* Process summary exclusions */ 1399566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt)); 140abe9303eSLisandro Dalcin if (opt) { 1419566063dSJacob Faibussowitsch PetscCall(PetscStrInList("partitioner", logList, ',', &pkg)); 1429566063dSJacob Faibussowitsch if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCPARTITIONER_CLASSID)); 143abe9303eSLisandro Dalcin } 144abe9303eSLisandro Dalcin /* Register package finalizer */ 1459566063dSJacob Faibussowitsch PetscCall(PetscRegisterFinalize(PetscPartitionerFinalizePackage)); 1463ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 147abe9303eSLisandro Dalcin } 148