xref: /petsc/src/dm/impls/da/dadist.c (revision 74427ab16e2f600998d325e2677dd1f2c0510e06)
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 
87087cfbeSBarry Smith PetscErrorCode  VecDuplicate_MPI_DA(Vec g,Vec *gg)
92dcb2ebcSBarry Smith {
102dcb2ebcSBarry Smith   PetscErrorCode ierr;
112dcb2ebcSBarry Smith   DM             da;
12077aedafSJed Brown   PetscLayout    map;
132dcb2ebcSBarry Smith 
142dcb2ebcSBarry Smith   PetscFunctionBegin;
15c688c046SMatthew G Knepley   ierr = VecGetDM(g, &da);CHKERRQ(ierr);
162dcb2ebcSBarry Smith   ierr = DMCreateGlobalVector(da,gg);CHKERRQ(ierr);
17077aedafSJed Brown   ierr = VecGetLayout(g,&map);CHKERRQ(ierr);
18077aedafSJed Brown   ierr = VecSetLayout(*gg,map);CHKERRQ(ierr);
192dcb2ebcSBarry Smith   PetscFunctionReturn(0);
202dcb2ebcSBarry Smith }
212dcb2ebcSBarry Smith 
227087cfbeSBarry Smith PetscErrorCode  DMCreateGlobalVector_DA(DM da,Vec *g)
2347c6ae99SBarry Smith {
2447c6ae99SBarry Smith   PetscErrorCode ierr;
2547c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
2647c6ae99SBarry Smith 
2747c6ae99SBarry Smith   PetscFunctionBegin;
2847c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
2947c6ae99SBarry Smith   PetscValidPointer(g,2);
30ce94432eSBarry Smith   ierr = VecCreate(PetscObjectComm((PetscObject)da),g);CHKERRQ(ierr);
3147c6ae99SBarry Smith   ierr = VecSetSizes(*g,dd->Nlocal,PETSC_DETERMINE);CHKERRQ(ierr);
32401ddaa8SBarry Smith   ierr = VecSetBlockSize(*g,dd->w);CHKERRQ(ierr);
3347c6ae99SBarry Smith   ierr = VecSetType(*g,da->vectype);CHKERRQ(ierr);
34*74427ab1SRichard Tran Mills   if (dd->Nlocal < da->bind_below) {
35*74427ab1SRichard Tran Mills     ierr = VecSetBindingPropagates(*g,PETSC_TRUE);CHKERRQ(ierr);
36*74427ab1SRichard Tran Mills     ierr = VecBindToCPU(*g,PETSC_TRUE);CHKERRQ(ierr);
37*74427ab1SRichard Tran Mills   }
38c688c046SMatthew G Knepley   ierr = VecSetDM(*g, da);CHKERRQ(ierr);
391411c6eeSJed Brown   ierr = VecSetLocalToGlobalMapping(*g,da->ltogmap);CHKERRQ(ierr);
4047c6ae99SBarry Smith   ierr = VecSetOperation(*g,VECOP_VIEW,(void (*)(void))VecView_MPI_DA);CHKERRQ(ierr);
4147c6ae99SBarry Smith   ierr = VecSetOperation(*g,VECOP_LOAD,(void (*)(void))VecLoad_Default_DA);CHKERRQ(ierr);
422dcb2ebcSBarry Smith   ierr = VecSetOperation(*g,VECOP_DUPLICATE,(void (*)(void))VecDuplicate_MPI_DA);CHKERRQ(ierr);
4347c6ae99SBarry Smith   PetscFunctionReturn(0);
4447c6ae99SBarry Smith }
4547c6ae99SBarry Smith 
4647c6ae99SBarry Smith /*@
47aa219208SBarry Smith    DMDACreateNaturalVector - Creates a parallel PETSc vector that
4847c6ae99SBarry Smith    will hold vector values in the natural numbering, rather than in
49aa219208SBarry Smith    the PETSc parallel numbering associated with the DMDA.
5047c6ae99SBarry Smith 
513ca8f39cSDave May    Collective
5247c6ae99SBarry Smith 
5347c6ae99SBarry Smith    Input Parameter:
5447c6ae99SBarry Smith .  da - the distributed array
5547c6ae99SBarry Smith 
5647c6ae99SBarry Smith    Output Parameter:
5747c6ae99SBarry Smith .  g - the distributed global vector
5847c6ae99SBarry Smith 
5947c6ae99SBarry Smith    Level: developer
6047c6ae99SBarry Smith 
6147c6ae99SBarry Smith    Note:
6247c6ae99SBarry Smith    The output parameter, g, is a regular PETSc vector that should be destroyed
6347c6ae99SBarry Smith    with a call to VecDestroy() when usage is finished.
6447c6ae99SBarry Smith 
6547c6ae99SBarry Smith    The number of local entries in the vector on each process is the same
66564755cdSBarry Smith    as in a vector created with DMCreateGlobalVector().
6747c6ae99SBarry Smith 
68564755cdSBarry Smith .seealso: DMCreateLocalVector(), VecDuplicate(), VecDuplicateVecs(),
69aa219208SBarry Smith           DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToLocalBegin(),
709df75925SJed Brown           DMGlobalToLocalEnd(), DMLocalToGlobalBegin()
7147c6ae99SBarry Smith @*/
727087cfbeSBarry Smith PetscErrorCode  DMDACreateNaturalVector(DM da,Vec *g)
7347c6ae99SBarry Smith {
7447c6ae99SBarry Smith   PetscErrorCode ierr;
7547c6ae99SBarry Smith   PetscInt       cnt;
7647c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
7747c6ae99SBarry Smith 
7847c6ae99SBarry Smith   PetscFunctionBegin;
79a9a02de4SBarry Smith   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
8047c6ae99SBarry Smith   PetscValidPointer(g,2);
8147c6ae99SBarry Smith   if (dd->natural) {
8247c6ae99SBarry Smith     ierr = PetscObjectGetReference((PetscObject)dd->natural,&cnt);CHKERRQ(ierr);
8347c6ae99SBarry Smith     if (cnt == 1) { /* object is not currently used by anyone */
8447c6ae99SBarry Smith       ierr = PetscObjectReference((PetscObject)dd->natural);CHKERRQ(ierr);
8547c6ae99SBarry Smith       *g   = dd->natural;
8647c6ae99SBarry Smith     } else {
8747c6ae99SBarry Smith       ierr = VecDuplicate(dd->natural,g);CHKERRQ(ierr);
8847c6ae99SBarry Smith     }
8947c6ae99SBarry Smith   } else { /* create the first version of this guy */
90ce94432eSBarry Smith     ierr = VecCreate(PetscObjectComm((PetscObject)da),g);CHKERRQ(ierr);
91a34bdc0bSBarry Smith     ierr = VecSetSizes(*g,dd->Nlocal,PETSC_DETERMINE);CHKERRQ(ierr);
9247c6ae99SBarry Smith     ierr = VecSetBlockSize(*g, dd->w);CHKERRQ(ierr);
93265bdeeeSBarry Smith     ierr = VecSetType(*g,da->vectype);CHKERRQ(ierr);
9447c6ae99SBarry Smith     ierr = PetscObjectReference((PetscObject)*g);CHKERRQ(ierr);
958865f1eaSKarl Rupp 
9647c6ae99SBarry Smith     dd->natural = *g;
9747c6ae99SBarry Smith   }
9847c6ae99SBarry Smith   PetscFunctionReturn(0);
9947c6ae99SBarry Smith }
10047c6ae99SBarry Smith 
101