xref: /petsc/src/dm/impls/da/daindex.c (revision 7a8be3513cf479fb6a672bd91de7eb6883fcfd02)
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