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 559db3d8bcSStefano Zampini Collective on DMDA 569db3d8bcSStefano Zampini 579db3d8bcSStefano Zampini Input Parameter: 58*a2b725a8SWilliam Gropp + da - the distributed array 59*a2b725a8SWilliam 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 689db3d8bcSStefano Zampini .keywords: distributed array, get, global, indices, local-to-global 699db3d8bcSStefano Zampini 709db3d8bcSStefano Zampini .seealso: DMDACreate2d(), DMDAGetAO(), DMDAGetGhostCorners(), DMDAGetCorners(), DMDALocalToGlocal() 719db3d8bcSStefano Zampini DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMLocalToLocalBegin(), DMLocalToLocalEnd(), DMDAGetGlobalIndices(), DMDAGetOwnershipRanges(), 729db3d8bcSStefano Zampini AO, AOPetscToApplication(), AOApplicationToPetsc() 739db3d8bcSStefano Zampini @*/ 749db3d8bcSStefano Zampini PetscErrorCode DMDASetAOType(DM da,AOType aotype) 759db3d8bcSStefano Zampini { 769db3d8bcSStefano Zampini DM_DA *dd; 779db3d8bcSStefano Zampini PetscBool isdmda; 789db3d8bcSStefano Zampini PetscErrorCode ierr; 799db3d8bcSStefano Zampini 809db3d8bcSStefano Zampini PetscFunctionBegin; 81a9a02de4SBarry Smith PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 829db3d8bcSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)da,DMDA,&isdmda);CHKERRQ(ierr); 839db3d8bcSStefano Zampini if (!isdmda) SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Requires a DMDA as input"); 849db3d8bcSStefano Zampini /* now we can safely dereference */ 859db3d8bcSStefano Zampini dd = (DM_DA*)da->data; 869db3d8bcSStefano Zampini if (dd->ao) { /* check if the already computed AO has the same type as requested */ 879db3d8bcSStefano Zampini PetscBool match; 889db3d8bcSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)dd->ao,aotype,&match);CHKERRQ(ierr); 899db3d8bcSStefano Zampini if (!match) SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Cannot change AO type"); 909db3d8bcSStefano Zampini PetscFunctionReturn(0); 919db3d8bcSStefano Zampini } 929db3d8bcSStefano Zampini ierr = PetscFree(dd->aotype);CHKERRQ(ierr); 939db3d8bcSStefano Zampini ierr = PetscStrallocpy(aotype,(char**)&dd->aotype);CHKERRQ(ierr); 949db3d8bcSStefano Zampini PetscFunctionReturn(0); 959db3d8bcSStefano Zampini } 969db3d8bcSStefano Zampini 9747c6ae99SBarry Smith /*@ 98aa219208SBarry Smith DMDAGetAO - Gets the application ordering context for a distributed array. 9947c6ae99SBarry Smith 100aa219208SBarry Smith Collective on DMDA 10147c6ae99SBarry Smith 10247c6ae99SBarry Smith Input Parameter: 10347c6ae99SBarry Smith . da - the distributed array 10447c6ae99SBarry Smith 10547c6ae99SBarry Smith Output Parameters: 106aa219208SBarry Smith . ao - the application ordering context for DMDAs 10747c6ae99SBarry Smith 10847c6ae99SBarry Smith Level: intermediate 10947c6ae99SBarry Smith 11047c6ae99SBarry Smith Notes: 11147c6ae99SBarry Smith In this case, the AO maps to the natural grid ordering that would be used 112aa219208SBarry Smith for the DMDA if only 1 processor were employed (ordering most rapidly in the 11347c6ae99SBarry Smith x-direction, then y, then z). Multiple degrees of freedom are numbered 11447c6ae99SBarry Smith for each node (rather than 1 component for the whole grid, then the next 11547c6ae99SBarry Smith component, etc.) 11647c6ae99SBarry Smith 1177a612ce8SBarry Smith Do NOT call AODestroy() on the ao returned by this function. 1187a612ce8SBarry Smith 11947c6ae99SBarry Smith .keywords: distributed array, get, global, indices, local-to-global 12047c6ae99SBarry Smith 1219db3d8bcSStefano Zampini .seealso: DMDACreate2d(), DMDASetAOType(), DMDAGetGhostCorners(), DMDAGetCorners(), DMDALocalToGlocal() 122565245c5SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMLocalToLocalBegin(), DMLocalToLocalEnd(), DMDAGetOwnershipRanges(), 12347c6ae99SBarry Smith AO, AOPetscToApplication(), AOApplicationToPetsc() 12447c6ae99SBarry Smith @*/ 1257087cfbeSBarry Smith PetscErrorCode DMDAGetAO(DM da,AO *ao) 12647c6ae99SBarry Smith { 12763868d81SStefano Zampini DM_DA *dd; 12863868d81SStefano Zampini PetscBool isdmda; 12963868d81SStefano Zampini PetscErrorCode ierr; 13047c6ae99SBarry Smith 13147c6ae99SBarry Smith PetscFunctionBegin; 132a9a02de4SBarry Smith PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 13347c6ae99SBarry Smith PetscValidPointer(ao,2); 13463868d81SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)da,DMDA,&isdmda);CHKERRQ(ierr); 13563868d81SStefano Zampini if (!isdmda) SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_SUP,"Requires a DMDA as input"); 13663868d81SStefano Zampini /* now we can safely dereference */ 13763868d81SStefano Zampini dd = (DM_DA*)da->data; 13847c6ae99SBarry Smith 13947c6ae99SBarry Smith /* 14047c6ae99SBarry Smith Build the natural ordering to PETSc ordering mappings. 14147c6ae99SBarry Smith */ 14247c6ae99SBarry Smith if (!dd->ao) { 14347c6ae99SBarry Smith IS ispetsc,isnatural; 14447c6ae99SBarry Smith PetscErrorCode ierr; 14547c6ae99SBarry Smith PetscInt Nlocal; 14647c6ae99SBarry Smith 147aa219208SBarry Smith ierr = DMDAGetNatural_Private(da,&Nlocal,&isnatural);CHKERRQ(ierr); 148ce94432eSBarry Smith ierr = ISCreateStride(PetscObjectComm((PetscObject)da),Nlocal,dd->base,1,&ispetsc);CHKERRQ(ierr); 149ee120560SStefano Zampini ierr = AOCreate(PetscObjectComm((PetscObject)da),&dd->ao);CHKERRQ(ierr); 150ee120560SStefano Zampini ierr = AOSetIS(dd->ao,isnatural,ispetsc);CHKERRQ(ierr); 15152a64b67SStefano Zampini ierr = AOSetType(dd->ao,dd->aotype);CHKERRQ(ierr); 1523bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)da,(PetscObject)dd->ao);CHKERRQ(ierr); 153fcfd50ebSBarry Smith ierr = ISDestroy(&ispetsc);CHKERRQ(ierr); 154fcfd50ebSBarry Smith ierr = ISDestroy(&isnatural);CHKERRQ(ierr); 15547c6ae99SBarry Smith } 15647c6ae99SBarry Smith *ao = dd->ao; 15747c6ae99SBarry Smith PetscFunctionReturn(0); 15847c6ae99SBarry Smith } 15947c6ae99SBarry Smith 1608ea3bf28SBarry Smith 161