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