147c6ae99SBarry Smith 247c6ae99SBarry Smith /* 347c6ae99SBarry Smith Code for manipulating distributed regular arrays in parallel. 447c6ae99SBarry Smith */ 547c6ae99SBarry Smith 6af0996ceSBarry Smith #include <petsc/private/dmdaimpl.h> /*I "petscdmda.h" I*/ 747c6ae99SBarry Smith 847c6ae99SBarry Smith /* 947c6ae99SBarry Smith Gets the natural number for each global number on the process. 1047c6ae99SBarry Smith 11aa219208SBarry Smith Used by DMDAGetAO() and DMDAGlobalToNatural_Create() 1247c6ae99SBarry Smith */ 13aa219208SBarry Smith PetscErrorCode DMDAGetNatural_Private(DM da,PetscInt *outNlocal,IS *isnatural) 1447c6ae99SBarry Smith { 1547c6ae99SBarry Smith PetscErrorCode ierr; 16c73cfb54SMatthew G. Knepley PetscInt Nlocal,i,j,k,*lidx,lict = 0,dim = da->dim; 1747c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 1847c6ae99SBarry Smith 1947c6ae99SBarry Smith PetscFunctionBegin; 2047c6ae99SBarry Smith Nlocal = (dd->xe-dd->xs); 21c73cfb54SMatthew G. Knepley if (dim > 1) Nlocal *= (dd->ye-dd->ys); 22c73cfb54SMatthew G. Knepley if (dim > 2) Nlocal *= (dd->ze-dd->zs); 2347c6ae99SBarry Smith 24785e854fSJed Brown ierr = PetscMalloc1(Nlocal,&lidx);CHKERRQ(ierr); 2547c6ae99SBarry Smith 26c73cfb54SMatthew G. Knepley if (dim == 1) { 2747c6ae99SBarry Smith for (i=dd->xs; i<dd->xe; i++) { 2847c6ae99SBarry Smith /* global number in natural ordering */ 2947c6ae99SBarry Smith lidx[lict++] = i; 3047c6ae99SBarry Smith } 31c73cfb54SMatthew G. Knepley } else if (dim == 2) { 3247c6ae99SBarry Smith for (j=dd->ys; j<dd->ye; j++) { 3347c6ae99SBarry Smith for (i=dd->xs; i<dd->xe; i++) { 3447c6ae99SBarry Smith /* global number in natural ordering */ 3547c6ae99SBarry Smith lidx[lict++] = i + j*dd->M*dd->w; 3647c6ae99SBarry Smith } 3747c6ae99SBarry Smith } 38c73cfb54SMatthew G. Knepley } else if (dim == 3) { 3947c6ae99SBarry Smith for (k=dd->zs; k<dd->ze; k++) { 4047c6ae99SBarry Smith for (j=dd->ys; j<dd->ye; j++) { 4147c6ae99SBarry Smith for (i=dd->xs; i<dd->xe; i++) { 4247c6ae99SBarry Smith lidx[lict++] = i + j*dd->M*dd->w + k*dd->M*dd->N*dd->w; 4347c6ae99SBarry Smith } 4447c6ae99SBarry Smith } 4547c6ae99SBarry Smith } 4647c6ae99SBarry Smith } 4747c6ae99SBarry Smith *outNlocal = Nlocal; 48ce94432eSBarry Smith ierr = ISCreateGeneral(PetscObjectComm((PetscObject)da),Nlocal,lidx,PETSC_OWN_POINTER,isnatural);CHKERRQ(ierr); 4947c6ae99SBarry Smith PetscFunctionReturn(0); 5047c6ae99SBarry Smith } 5147c6ae99SBarry Smith 5292e66395SSatish Balay /*@C 539db3d8bcSStefano Zampini DMDASetAOType - Sets the type of application ordering for a distributed array. 549db3d8bcSStefano Zampini 55d083f849SBarry Smith Collective on da 569db3d8bcSStefano Zampini 57d8d19677SJose E. Roman Input Parameters: 58a2b725a8SWilliam Gropp + da - the distributed array 59a2b725a8SWilliam Gropp - aotype - type of AO 609db3d8bcSStefano Zampini 619db3d8bcSStefano Zampini Output Parameters: 629db3d8bcSStefano Zampini 639db3d8bcSStefano Zampini Level: intermediate 649db3d8bcSStefano Zampini 659db3d8bcSStefano Zampini Notes: 669db3d8bcSStefano Zampini It will generate and error if an AO has already been obtained with a call to DMDAGetAO and the user sets a different AOType 679db3d8bcSStefano Zampini 689df75925SJed Brown .seealso: DMDACreate2d(), DMDAGetAO(), DMDAGetGhostCorners(), DMDAGetCorners(), DMLocalToGlobal() 699db3d8bcSStefano Zampini DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMLocalToLocalBegin(), DMLocalToLocalEnd(), DMDAGetGlobalIndices(), DMDAGetOwnershipRanges(), 709db3d8bcSStefano Zampini AO, AOPetscToApplication(), AOApplicationToPetsc() 719db3d8bcSStefano Zampini @*/ 729db3d8bcSStefano Zampini PetscErrorCode DMDASetAOType(DM da,AOType aotype) 739db3d8bcSStefano Zampini { 749db3d8bcSStefano Zampini DM_DA *dd; 759db3d8bcSStefano Zampini PetscBool isdmda; 769db3d8bcSStefano Zampini PetscErrorCode ierr; 779db3d8bcSStefano Zampini 789db3d8bcSStefano Zampini PetscFunctionBegin; 79a9a02de4SBarry Smith PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 809db3d8bcSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)da,DMDA,&isdmda);CHKERRQ(ierr); 81*7a8be351SBarry Smith PetscCheck(isdmda,PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Requires a DMDA as input"); 829db3d8bcSStefano Zampini /* now we can safely dereference */ 839db3d8bcSStefano Zampini dd = (DM_DA*)da->data; 849db3d8bcSStefano Zampini if (dd->ao) { /* check if the already computed AO has the same type as requested */ 859db3d8bcSStefano Zampini PetscBool match; 869db3d8bcSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)dd->ao,aotype,&match);CHKERRQ(ierr); 87*7a8be351SBarry Smith PetscCheck(match,PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Cannot change AO type"); 889db3d8bcSStefano Zampini PetscFunctionReturn(0); 899db3d8bcSStefano Zampini } 909db3d8bcSStefano Zampini ierr = PetscFree(dd->aotype);CHKERRQ(ierr); 919db3d8bcSStefano Zampini ierr = PetscStrallocpy(aotype,(char**)&dd->aotype);CHKERRQ(ierr); 929db3d8bcSStefano Zampini PetscFunctionReturn(0); 939db3d8bcSStefano Zampini } 949db3d8bcSStefano Zampini 9547c6ae99SBarry Smith /*@ 96aa219208SBarry Smith DMDAGetAO - Gets the application ordering context for a distributed array. 9747c6ae99SBarry Smith 98d083f849SBarry Smith Collective on da 9947c6ae99SBarry Smith 10047c6ae99SBarry Smith Input Parameter: 10147c6ae99SBarry Smith . da - the distributed array 10247c6ae99SBarry Smith 10347c6ae99SBarry Smith Output Parameters: 104aa219208SBarry Smith . ao - the application ordering context for DMDAs 10547c6ae99SBarry Smith 10647c6ae99SBarry Smith Level: intermediate 10747c6ae99SBarry Smith 10847c6ae99SBarry Smith Notes: 10947c6ae99SBarry Smith In this case, the AO maps to the natural grid ordering that would be used 110aa219208SBarry Smith for the DMDA if only 1 processor were employed (ordering most rapidly in the 11147c6ae99SBarry Smith x-direction, then y, then z). Multiple degrees of freedom are numbered 11247c6ae99SBarry Smith for each node (rather than 1 component for the whole grid, then the next 11347c6ae99SBarry Smith component, etc.) 11447c6ae99SBarry Smith 1157a612ce8SBarry Smith Do NOT call AODestroy() on the ao returned by this function. 1167a612ce8SBarry Smith 1179df75925SJed Brown .seealso: DMDACreate2d(), DMDASetAOType(), DMDAGetGhostCorners(), DMDAGetCorners(), DMLocalToGlobal() 118565245c5SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMLocalToLocalBegin(), DMLocalToLocalEnd(), DMDAGetOwnershipRanges(), 11947c6ae99SBarry Smith AO, AOPetscToApplication(), AOApplicationToPetsc() 12047c6ae99SBarry Smith @*/ 1217087cfbeSBarry Smith PetscErrorCode DMDAGetAO(DM da,AO *ao) 12247c6ae99SBarry Smith { 12363868d81SStefano Zampini DM_DA *dd; 12463868d81SStefano Zampini PetscBool isdmda; 12563868d81SStefano Zampini PetscErrorCode ierr; 12647c6ae99SBarry Smith 12747c6ae99SBarry Smith PetscFunctionBegin; 128a9a02de4SBarry Smith PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 12947c6ae99SBarry Smith PetscValidPointer(ao,2); 13063868d81SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)da,DMDA,&isdmda);CHKERRQ(ierr); 131*7a8be351SBarry Smith PetscCheck(isdmda,PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Requires a DMDA as input"); 13263868d81SStefano Zampini /* now we can safely dereference */ 13363868d81SStefano Zampini dd = (DM_DA*)da->data; 13447c6ae99SBarry Smith 13547c6ae99SBarry Smith /* 13647c6ae99SBarry Smith Build the natural ordering to PETSc ordering mappings. 13747c6ae99SBarry Smith */ 13847c6ae99SBarry Smith if (!dd->ao) { 13947c6ae99SBarry Smith IS ispetsc,isnatural; 14047c6ae99SBarry Smith PetscErrorCode ierr; 14147c6ae99SBarry Smith PetscInt Nlocal; 14247c6ae99SBarry Smith 143aa219208SBarry Smith ierr = DMDAGetNatural_Private(da,&Nlocal,&isnatural);CHKERRQ(ierr); 144ce94432eSBarry Smith ierr = ISCreateStride(PetscObjectComm((PetscObject)da),Nlocal,dd->base,1,&ispetsc);CHKERRQ(ierr); 145ee120560SStefano Zampini ierr = AOCreate(PetscObjectComm((PetscObject)da),&dd->ao);CHKERRQ(ierr); 146ee120560SStefano Zampini ierr = AOSetIS(dd->ao,isnatural,ispetsc);CHKERRQ(ierr); 14752a64b67SStefano Zampini ierr = AOSetType(dd->ao,dd->aotype);CHKERRQ(ierr); 1483bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)da,(PetscObject)dd->ao);CHKERRQ(ierr); 149fcfd50ebSBarry Smith ierr = ISDestroy(&ispetsc);CHKERRQ(ierr); 150fcfd50ebSBarry Smith ierr = ISDestroy(&isnatural);CHKERRQ(ierr); 15147c6ae99SBarry Smith } 15247c6ae99SBarry Smith *ao = dd->ao; 15347c6ae99SBarry Smith PetscFunctionReturn(0); 15447c6ae99SBarry Smith } 15547c6ae99SBarry Smith 156