147c6ae99SBarry Smith #define PETSCDM_DLL 247c6ae99SBarry Smith 347c6ae99SBarry Smith /* 447c6ae99SBarry Smith Code for manipulating distributed regular arrays in parallel. 547c6ae99SBarry Smith */ 647c6ae99SBarry Smith 747c6ae99SBarry Smith #include "private/daimpl.h" /*I "petscda.h" I*/ 847c6ae99SBarry Smith 947c6ae99SBarry Smith #undef __FUNCT__ 10*aa219208SBarry Smith #define __FUNCT__ "DMDAGetGlobalIndices" 1147c6ae99SBarry Smith /*@C 12*aa219208SBarry Smith DMDAGetGlobalIndices - Returns the global node number of all local nodes, 1347c6ae99SBarry Smith including ghost nodes. 1447c6ae99SBarry Smith 1547c6ae99SBarry Smith Not Collective 1647c6ae99SBarry Smith 1747c6ae99SBarry Smith Input Parameter: 1847c6ae99SBarry Smith . da - the distributed array 1947c6ae99SBarry Smith 2047c6ae99SBarry Smith Output Parameters: 2147c6ae99SBarry Smith + n - the number of local elements, including ghost nodes (or PETSC_NULL) 2247c6ae99SBarry Smith - idx - the global indices 2347c6ae99SBarry Smith 2447c6ae99SBarry Smith Level: intermediate 2547c6ae99SBarry Smith 2647c6ae99SBarry Smith Note: 27*aa219208SBarry Smith For DMDA_STENCIL_STAR stencils the inactive corner ghost nodes are also included 2847c6ae99SBarry Smith in the list of local indices (even though those nodes are not updated 29*aa219208SBarry Smith during calls to DMDAXXXToXXX(). 3047c6ae99SBarry Smith 3147c6ae99SBarry Smith Essentially the same data is returned in the form of a local-to-global mapping 32*aa219208SBarry Smith with the routine DMDAGetISLocalToGlobalMapping(); 3347c6ae99SBarry Smith 3447c6ae99SBarry Smith Fortran Note: 3547c6ae99SBarry Smith This routine is used differently from Fortran 3647c6ae99SBarry Smith .vb 379a42bb27SBarry Smith DM da 3847c6ae99SBarry Smith integer n,da_array(1) 3947c6ae99SBarry Smith PetscOffset i_da 4047c6ae99SBarry Smith integer ierr 41*aa219208SBarry Smith call DMDAGetGlobalIndices(da,n,da_array,i_da,ierr) 4247c6ae99SBarry Smith 4347c6ae99SBarry Smith C Access first local entry in list 4447c6ae99SBarry Smith value = da_array(i_da + 1) 4547c6ae99SBarry Smith .ve 4647c6ae99SBarry Smith 4747c6ae99SBarry Smith See the <A href="../../docs/manual.pdf#nameddest=ch_fortran">Fortran chapter</A> of the users manual for details. 4847c6ae99SBarry Smith 4947c6ae99SBarry Smith .keywords: distributed array, get, global, indices, local-to-global 5047c6ae99SBarry Smith 51*aa219208SBarry Smith .seealso: DMDACreate2d(), DMDAGetGhostCorners(), DMDAGetCorners(), DMLocalToGlobalBegin() 52*aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDALocalToLocalBegin(), DMDAGetAO(), DMDAGetGlobalIndicesF90() 53*aa219208SBarry Smith DMDAGetISLocalToGlobalMapping(), DMDACreate3d(), DMDACreate1d(), DMDALocalToLocalEnd(), DMDAGetOwnershipRanges() 5447c6ae99SBarry Smith @*/ 55*aa219208SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMDAGetGlobalIndices(DM da,PetscInt *n,PetscInt **idx) 5647c6ae99SBarry Smith { 5747c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 5847c6ae99SBarry Smith 5947c6ae99SBarry Smith PetscFunctionBegin; 6047c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 6147c6ae99SBarry Smith if (n) *n = dd->Nl; 6247c6ae99SBarry Smith if (idx) *idx = dd->idx; 6347c6ae99SBarry Smith PetscFunctionReturn(0); 6447c6ae99SBarry Smith } 6547c6ae99SBarry Smith 6647c6ae99SBarry Smith #undef __FUNCT__ 67*aa219208SBarry Smith #define __FUNCT__ "DMDAGetNatural_Private" 6847c6ae99SBarry Smith /* 6947c6ae99SBarry Smith Gets the natural number for each global number on the process. 7047c6ae99SBarry Smith 71*aa219208SBarry Smith Used by DMDAGetAO() and DMDAGlobalToNatural_Create() 7247c6ae99SBarry Smith */ 73*aa219208SBarry Smith PetscErrorCode DMDAGetNatural_Private(DM da,PetscInt *outNlocal,IS *isnatural) 7447c6ae99SBarry Smith { 7547c6ae99SBarry Smith PetscErrorCode ierr; 7647c6ae99SBarry Smith PetscInt Nlocal,i,j,k,*lidx,lict = 0; 7747c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 7847c6ae99SBarry Smith 7947c6ae99SBarry Smith PetscFunctionBegin; 8047c6ae99SBarry Smith Nlocal = (dd->xe-dd->xs); 8147c6ae99SBarry Smith if (dd->dim > 1) { 8247c6ae99SBarry Smith Nlocal *= (dd->ye-dd->ys); 8347c6ae99SBarry Smith } 8447c6ae99SBarry Smith if (dd->dim > 2) { 8547c6ae99SBarry Smith Nlocal *= (dd->ze-dd->zs); 8647c6ae99SBarry Smith } 8747c6ae99SBarry Smith 8847c6ae99SBarry Smith ierr = PetscMalloc(Nlocal*sizeof(PetscInt),&lidx);CHKERRQ(ierr); 8947c6ae99SBarry Smith 9047c6ae99SBarry Smith if (dd->dim == 1) { 9147c6ae99SBarry Smith for (i=dd->xs; i<dd->xe; i++) { 9247c6ae99SBarry Smith /* global number in natural ordering */ 9347c6ae99SBarry Smith lidx[lict++] = i; 9447c6ae99SBarry Smith } 9547c6ae99SBarry Smith } else if (dd->dim == 2) { 9647c6ae99SBarry Smith for (j=dd->ys; j<dd->ye; j++) { 9747c6ae99SBarry Smith for (i=dd->xs; i<dd->xe; i++) { 9847c6ae99SBarry Smith /* global number in natural ordering */ 9947c6ae99SBarry Smith lidx[lict++] = i + j*dd->M*dd->w; 10047c6ae99SBarry Smith } 10147c6ae99SBarry Smith } 10247c6ae99SBarry Smith } else if (dd->dim == 3) { 10347c6ae99SBarry Smith for (k=dd->zs; k<dd->ze; k++) { 10447c6ae99SBarry Smith for (j=dd->ys; j<dd->ye; j++) { 10547c6ae99SBarry Smith for (i=dd->xs; i<dd->xe; i++) { 10647c6ae99SBarry Smith lidx[lict++] = i + j*dd->M*dd->w + k*dd->M*dd->N*dd->w; 10747c6ae99SBarry Smith } 10847c6ae99SBarry Smith } 10947c6ae99SBarry Smith } 11047c6ae99SBarry Smith } 11147c6ae99SBarry Smith *outNlocal = Nlocal; 11247c6ae99SBarry Smith ierr = ISCreateGeneral(((PetscObject)da)->comm,Nlocal,lidx,PETSC_OWN_POINTER,isnatural);CHKERRQ(ierr); 11347c6ae99SBarry Smith PetscFunctionReturn(0); 11447c6ae99SBarry Smith } 11547c6ae99SBarry Smith 11647c6ae99SBarry Smith #undef __FUNCT__ 117*aa219208SBarry Smith #define __FUNCT__ "DMDAGetAO" 11847c6ae99SBarry Smith /*@ 119*aa219208SBarry Smith DMDAGetAO - Gets the application ordering context for a distributed array. 12047c6ae99SBarry Smith 121*aa219208SBarry Smith Collective on DMDA 12247c6ae99SBarry Smith 12347c6ae99SBarry Smith Input Parameter: 12447c6ae99SBarry Smith . da - the distributed array 12547c6ae99SBarry Smith 12647c6ae99SBarry Smith Output Parameters: 127*aa219208SBarry Smith . ao - the application ordering context for DMDAs 12847c6ae99SBarry Smith 12947c6ae99SBarry Smith Level: intermediate 13047c6ae99SBarry Smith 13147c6ae99SBarry Smith Notes: 13247c6ae99SBarry Smith In this case, the AO maps to the natural grid ordering that would be used 133*aa219208SBarry Smith for the DMDA if only 1 processor were employed (ordering most rapidly in the 13447c6ae99SBarry Smith x-direction, then y, then z). Multiple degrees of freedom are numbered 13547c6ae99SBarry Smith for each node (rather than 1 component for the whole grid, then the next 13647c6ae99SBarry Smith component, etc.) 13747c6ae99SBarry Smith 13847c6ae99SBarry Smith .keywords: distributed array, get, global, indices, local-to-global 13947c6ae99SBarry Smith 140*aa219208SBarry Smith .seealso: DMDACreate2d(), DMDAGetGhostCorners(), DMDAGetCorners(), DMDALocalToGlocal() 141*aa219208SBarry Smith DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDALocalToLocalBegin(), DMDALocalToLocalEnd(), DMDAGetGlobalIndices(), DMDAGetOwnershipRanges(), 14247c6ae99SBarry Smith AO, AOPetscToApplication(), AOApplicationToPetsc() 14347c6ae99SBarry Smith @*/ 144*aa219208SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMDAGetAO(DM da,AO *ao) 14547c6ae99SBarry Smith { 14647c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 14747c6ae99SBarry Smith 14847c6ae99SBarry Smith PetscFunctionBegin; 14947c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 15047c6ae99SBarry Smith PetscValidPointer(ao,2); 15147c6ae99SBarry Smith 15247c6ae99SBarry Smith /* 15347c6ae99SBarry Smith Build the natural ordering to PETSc ordering mappings. 15447c6ae99SBarry Smith */ 15547c6ae99SBarry Smith if (!dd->ao) { 15647c6ae99SBarry Smith IS ispetsc,isnatural; 15747c6ae99SBarry Smith PetscErrorCode ierr; 15847c6ae99SBarry Smith PetscInt Nlocal; 15947c6ae99SBarry Smith 160*aa219208SBarry Smith ierr = DMDAGetNatural_Private(da,&Nlocal,&isnatural);CHKERRQ(ierr); 16147c6ae99SBarry Smith ierr = ISCreateStride(((PetscObject)da)->comm,Nlocal,dd->base,1,&ispetsc);CHKERRQ(ierr); 16247c6ae99SBarry Smith ierr = AOCreateBasicIS(isnatural,ispetsc,&dd->ao);CHKERRQ(ierr); 16347c6ae99SBarry Smith ierr = PetscLogObjectParent(da,dd->ao);CHKERRQ(ierr); 16447c6ae99SBarry Smith ierr = ISDestroy(ispetsc);CHKERRQ(ierr); 16547c6ae99SBarry Smith ierr = ISDestroy(isnatural);CHKERRQ(ierr); 16647c6ae99SBarry Smith } 16747c6ae99SBarry Smith *ao = dd->ao; 16847c6ae99SBarry Smith PetscFunctionReturn(0); 16947c6ae99SBarry Smith } 17047c6ae99SBarry Smith 17147c6ae99SBarry Smith /*MC 172*aa219208SBarry Smith DMDAGetGlobalIndicesF90 - Returns a Fortran90 pointer to the list of 17347c6ae99SBarry Smith global indices (global node number of all local nodes, including 17447c6ae99SBarry Smith ghost nodes). 17547c6ae99SBarry Smith 17647c6ae99SBarry Smith Synopsis: 177*aa219208SBarry Smith DMDAGetGlobalIndicesF90(DM da,integer n,{integer, pointer :: idx(:)},integer ierr) 17847c6ae99SBarry Smith 17947c6ae99SBarry Smith Not Collective 18047c6ae99SBarry Smith 18147c6ae99SBarry Smith Input Parameter: 18247c6ae99SBarry Smith . da - the distributed array 18347c6ae99SBarry Smith 18447c6ae99SBarry Smith Output Parameters: 18547c6ae99SBarry Smith + n - the number of local elements, including ghost nodes (or PETSC_NULL) 18647c6ae99SBarry Smith . idx - the Fortran90 pointer to the global indices 18747c6ae99SBarry Smith - ierr - error code 18847c6ae99SBarry Smith 18947c6ae99SBarry Smith Level: intermediate 19047c6ae99SBarry Smith 19147c6ae99SBarry Smith Notes: 19247c6ae99SBarry Smith Not yet supported for all F90 compilers 19347c6ae99SBarry Smith 19447c6ae99SBarry Smith .keywords: distributed array, get, global, indices, local-to-global, f90 19547c6ae99SBarry Smith 196*aa219208SBarry Smith .seealso: DMDAGetGlobalIndices() 19747c6ae99SBarry Smith M*/ 198