10ea77edaSksagiyam static char help[] = "Test PetscSFFCompose against some corner cases \n\n"; 20ea77edaSksagiyam 30ea77edaSksagiyam #include <petscsf.h> 40ea77edaSksagiyam 5d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv) 6d71ae5a4SJacob Faibussowitsch { 70ea77edaSksagiyam PetscMPIInt size; 80ea77edaSksagiyam PetscSF sfA0, sfA1, sfA2, sfB; 90ea77edaSksagiyam PetscInt nroots, nleaves; 100ea77edaSksagiyam PetscInt *ilocalA0, *ilocalA1, *ilocalA2, *ilocalB; 110ea77edaSksagiyam PetscSFNode *iremoteA0, *iremoteA1, *iremoteA2, *iremoteB; 120ea77edaSksagiyam 130ea77edaSksagiyam PetscFunctionBeginUser; 140ea77edaSksagiyam PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 150ea77edaSksagiyam PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 16*bd158744SPierre Jolivet PetscCheck(size == 1, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Only coded for one MPI process"); 170ea77edaSksagiyam PetscCall(PetscSFCreate(PETSC_COMM_WORLD, &sfA0)); 180ea77edaSksagiyam PetscCall(PetscSFCreate(PETSC_COMM_WORLD, &sfA1)); 190ea77edaSksagiyam PetscCall(PetscSFCreate(PETSC_COMM_WORLD, &sfA2)); 200ea77edaSksagiyam PetscCall(PetscSFCreate(PETSC_COMM_WORLD, &sfB)); 210ea77edaSksagiyam /* sfA0 */ 220ea77edaSksagiyam nroots = 1; 230ea77edaSksagiyam nleaves = 0; 240ea77edaSksagiyam PetscCall(PetscMalloc1(nleaves, &ilocalA0)); 250ea77edaSksagiyam PetscCall(PetscMalloc1(nleaves, &iremoteA0)); 260ea77edaSksagiyam PetscCall(PetscSFSetGraph(sfA0, nroots, nleaves, ilocalA0, PETSC_OWN_POINTER, iremoteA0, PETSC_OWN_POINTER)); 270ea77edaSksagiyam PetscCall(PetscSFSetUp(sfA0)); 280ea77edaSksagiyam PetscCall(PetscObjectSetName((PetscObject)sfA0, "sfA0")); 290ea77edaSksagiyam PetscCall(PetscSFView(sfA0, NULL)); 300ea77edaSksagiyam /* sfA1 */ 310ea77edaSksagiyam nroots = 1; 320ea77edaSksagiyam nleaves = 1; 330ea77edaSksagiyam PetscCall(PetscMalloc1(nleaves, &ilocalA1)); 340ea77edaSksagiyam PetscCall(PetscMalloc1(nleaves, &iremoteA1)); 350ea77edaSksagiyam ilocalA1[0] = 1; 360ea77edaSksagiyam iremoteA1[0].rank = 0; 370ea77edaSksagiyam iremoteA1[0].index = 0; 380ea77edaSksagiyam PetscCall(PetscSFSetGraph(sfA1, nroots, nleaves, ilocalA1, PETSC_OWN_POINTER, iremoteA1, PETSC_OWN_POINTER)); 390ea77edaSksagiyam PetscCall(PetscSFSetUp(sfA1)); 400ea77edaSksagiyam PetscCall(PetscObjectSetName((PetscObject)sfA1, "sfA1")); 410ea77edaSksagiyam PetscCall(PetscSFView(sfA1, NULL)); 420ea77edaSksagiyam /* sfA2 */ 430ea77edaSksagiyam nroots = 1; 440ea77edaSksagiyam nleaves = 1; 450ea77edaSksagiyam PetscCall(PetscMalloc1(nleaves, &ilocalA2)); 460ea77edaSksagiyam PetscCall(PetscMalloc1(nleaves, &iremoteA2)); 470ea77edaSksagiyam ilocalA2[0] = 0; 480ea77edaSksagiyam iremoteA2[0].rank = 0; 490ea77edaSksagiyam iremoteA2[0].index = 0; 500ea77edaSksagiyam PetscCall(PetscSFSetGraph(sfA2, nroots, nleaves, ilocalA2, PETSC_OWN_POINTER, iremoteA2, PETSC_OWN_POINTER)); 510ea77edaSksagiyam PetscCall(PetscSFSetUp(sfA2)); 520ea77edaSksagiyam PetscCall(PetscObjectSetName((PetscObject)sfA2, "sfA2")); 530ea77edaSksagiyam PetscCall(PetscSFView(sfA2, NULL)); 540ea77edaSksagiyam /* sfB */ 550ea77edaSksagiyam nroots = 2; 560ea77edaSksagiyam nleaves = 2; 570ea77edaSksagiyam PetscCall(PetscMalloc1(nleaves, &ilocalB)); 580ea77edaSksagiyam PetscCall(PetscMalloc1(nleaves, &iremoteB)); 590ea77edaSksagiyam ilocalB[0] = 100; 600ea77edaSksagiyam iremoteB[0].rank = 0; 610ea77edaSksagiyam iremoteB[0].index = 0; 620ea77edaSksagiyam ilocalB[1] = 101; 630ea77edaSksagiyam iremoteB[1].rank = 0; 640ea77edaSksagiyam iremoteB[1].index = 1; 650ea77edaSksagiyam PetscCall(PetscSFSetGraph(sfB, nroots, nleaves, ilocalB, PETSC_OWN_POINTER, iremoteB, PETSC_OWN_POINTER)); 660ea77edaSksagiyam PetscCall(PetscSFSetUp(sfB)); 670ea77edaSksagiyam PetscCall(PetscObjectSetName((PetscObject)sfB, "sfB")); 680ea77edaSksagiyam PetscCall(PetscSFView(sfB, NULL)); 690ea77edaSksagiyam /* Test 0 */ 700ea77edaSksagiyam { 710ea77edaSksagiyam PetscSF sfC; 720ea77edaSksagiyam 730ea77edaSksagiyam PetscCall(PetscSFCompose(sfA0, sfB, &sfC)); 740ea77edaSksagiyam PetscCall(PetscObjectSetName((PetscObject)sfC, "PetscSFCompose(sfA0, sfB)")); 750ea77edaSksagiyam PetscCall(PetscSFView(sfC, NULL)); 760ea77edaSksagiyam PetscCall(PetscSFDestroy(&sfC)); 770ea77edaSksagiyam } 780ea77edaSksagiyam /* Test 1 */ 790ea77edaSksagiyam { 800ea77edaSksagiyam PetscSF sfC; 810ea77edaSksagiyam 820ea77edaSksagiyam PetscCall(PetscSFCompose(sfA1, sfB, &sfC)); 830ea77edaSksagiyam PetscCall(PetscObjectSetName((PetscObject)sfC, "PetscSFCompose(sfA1, sfB)")); 840ea77edaSksagiyam PetscCall(PetscSFView(sfC, NULL)); 850ea77edaSksagiyam PetscCall(PetscSFDestroy(&sfC)); 860ea77edaSksagiyam } 870ea77edaSksagiyam /* Test 2 */ 880ea77edaSksagiyam { 890ea77edaSksagiyam PetscSF sfC; 900ea77edaSksagiyam 910ea77edaSksagiyam PetscCall(PetscSFCompose(sfA2, sfB, &sfC)); 920ea77edaSksagiyam PetscCall(PetscObjectSetName((PetscObject)sfC, "PetscSFCompose(sfA2, sfB)")); 930ea77edaSksagiyam PetscCall(PetscSFView(sfC, NULL)); 940ea77edaSksagiyam PetscCall(PetscSFDestroy(&sfC)); 950ea77edaSksagiyam } 960ea77edaSksagiyam PetscCall(PetscSFDestroy(&sfA0)); 970ea77edaSksagiyam PetscCall(PetscSFDestroy(&sfA1)); 980ea77edaSksagiyam PetscCall(PetscSFDestroy(&sfA2)); 990ea77edaSksagiyam PetscCall(PetscSFDestroy(&sfB)); 1000ea77edaSksagiyam PetscCall(PetscFinalize()); 1010ea77edaSksagiyam return 0; 1020ea77edaSksagiyam } 1030ea77edaSksagiyam 1040ea77edaSksagiyam /*TEST 1050ea77edaSksagiyam 1060ea77edaSksagiyam test: 1070ea77edaSksagiyam suffix: 0 1080ea77edaSksagiyam 1090ea77edaSksagiyam TEST*/ 110