xref: /petsc/src/dm/impls/da/dadist.c (revision ce94432eddcd14845bc7e8083b7f8ea723b9bf7d)
147c6ae99SBarry Smith 
247c6ae99SBarry Smith /*
347c6ae99SBarry Smith   Code for manipulating distributed regular arrays in parallel.
447c6ae99SBarry Smith */
547c6ae99SBarry Smith 
6b45d2f2cSJed Brown #include <petsc-private/daimpl.h>    /*I   "petscdmda.h"   I*/
747c6ae99SBarry Smith 
847c6ae99SBarry Smith #undef __FUNCT__
92dcb2ebcSBarry Smith #define __FUNCT__ "VecDuplicate_MPI_DA"
107087cfbeSBarry Smith PetscErrorCode  VecDuplicate_MPI_DA(Vec g,Vec *gg)
112dcb2ebcSBarry Smith {
122dcb2ebcSBarry Smith   PetscErrorCode ierr;
132dcb2ebcSBarry Smith   DM             da;
14077aedafSJed Brown   PetscLayout    map;
152dcb2ebcSBarry Smith 
162dcb2ebcSBarry Smith   PetscFunctionBegin;
17c688c046SMatthew G Knepley   ierr = VecGetDM(g, &da);CHKERRQ(ierr);
182dcb2ebcSBarry Smith   ierr = DMCreateGlobalVector(da,gg);CHKERRQ(ierr);
19077aedafSJed Brown   ierr = VecGetLayout(g,&map);CHKERRQ(ierr);
20077aedafSJed Brown   ierr = VecSetLayout(*gg,map);CHKERRQ(ierr);
212dcb2ebcSBarry Smith   PetscFunctionReturn(0);
222dcb2ebcSBarry Smith }
232dcb2ebcSBarry Smith 
242dcb2ebcSBarry Smith 
252dcb2ebcSBarry Smith #undef __FUNCT__
26564755cdSBarry Smith #define __FUNCT__ "DMCreateGlobalVector_DA"
277087cfbeSBarry Smith PetscErrorCode  DMCreateGlobalVector_DA(DM da,Vec *g)
2847c6ae99SBarry Smith {
2947c6ae99SBarry Smith   PetscErrorCode ierr;
3047c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
3147c6ae99SBarry Smith 
3247c6ae99SBarry Smith   PetscFunctionBegin;
3347c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
3447c6ae99SBarry Smith   PetscValidPointer(g,2);
3511689aebSJed Brown   if (da->defaultSection) {
3611689aebSJed Brown     ierr = DMCreateGlobalVector_Section_Private(da,g);CHKERRQ(ierr);
3711689aebSJed Brown   } else {
38*ce94432eSBarry Smith     ierr = VecCreate(PetscObjectComm((PetscObject)da),g);CHKERRQ(ierr);
3947c6ae99SBarry Smith     ierr = VecSetSizes(*g,dd->Nlocal,PETSC_DETERMINE);CHKERRQ(ierr);
40401ddaa8SBarry Smith     ierr = VecSetBlockSize(*g,dd->w);CHKERRQ(ierr);
4147c6ae99SBarry Smith     ierr = VecSetType(*g,da->vectype);CHKERRQ(ierr);
421ca04561SShri Abhyankar     ierr = VecSetFromOptions(*g);CHKERRQ(ierr);
43c688c046SMatthew G Knepley     ierr = VecSetDM(*g, da);CHKERRQ(ierr);
441411c6eeSJed Brown     ierr = VecSetLocalToGlobalMapping(*g,da->ltogmap);CHKERRQ(ierr);
451411c6eeSJed Brown     ierr = VecSetLocalToGlobalMappingBlock(*g,da->ltogmapb);CHKERRQ(ierr);
4611689aebSJed Brown   }
4747c6ae99SBarry Smith   ierr = VecSetOperation(*g,VECOP_VIEW,(void (*)(void))VecView_MPI_DA);CHKERRQ(ierr);
4847c6ae99SBarry Smith   ierr = VecSetOperation(*g,VECOP_LOAD,(void (*)(void))VecLoad_Default_DA);CHKERRQ(ierr);
492dcb2ebcSBarry Smith   ierr = VecSetOperation(*g,VECOP_DUPLICATE,(void (*)(void))VecDuplicate_MPI_DA);CHKERRQ(ierr);
5047c6ae99SBarry Smith   PetscFunctionReturn(0);
5147c6ae99SBarry Smith }
5247c6ae99SBarry Smith 
5347c6ae99SBarry Smith #undef __FUNCT__
54aa219208SBarry Smith #define __FUNCT__ "DMDACreateNaturalVector"
5547c6ae99SBarry Smith /*@
56aa219208SBarry Smith    DMDACreateNaturalVector - Creates a parallel PETSc vector that
5747c6ae99SBarry Smith    will hold vector values in the natural numbering, rather than in
58aa219208SBarry Smith    the PETSc parallel numbering associated with the DMDA.
5947c6ae99SBarry Smith 
60aa219208SBarry Smith    Collective on DMDA
6147c6ae99SBarry Smith 
6247c6ae99SBarry Smith    Input Parameter:
6347c6ae99SBarry Smith .  da - the distributed array
6447c6ae99SBarry Smith 
6547c6ae99SBarry Smith    Output Parameter:
6647c6ae99SBarry Smith .  g - the distributed global vector
6747c6ae99SBarry Smith 
6847c6ae99SBarry Smith    Level: developer
6947c6ae99SBarry Smith 
7047c6ae99SBarry Smith    Note:
7147c6ae99SBarry Smith    The output parameter, g, is a regular PETSc vector that should be destroyed
7247c6ae99SBarry Smith    with a call to VecDestroy() when usage is finished.
7347c6ae99SBarry Smith 
7447c6ae99SBarry Smith    The number of local entries in the vector on each process is the same
75564755cdSBarry Smith    as in a vector created with DMCreateGlobalVector().
7647c6ae99SBarry Smith 
7747c6ae99SBarry Smith .keywords: distributed array, create, global, distributed, vector
7847c6ae99SBarry Smith 
79564755cdSBarry Smith .seealso: DMCreateLocalVector(), VecDuplicate(), VecDuplicateVecs(),
80aa219208SBarry Smith           DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToLocalBegin(),
81aa219208SBarry Smith           DMGlobalToLocalEnd(), DMDALocalToGlobalBegin()
8247c6ae99SBarry Smith @*/
837087cfbeSBarry Smith PetscErrorCode  DMDACreateNaturalVector(DM da,Vec *g)
8447c6ae99SBarry Smith {
8547c6ae99SBarry Smith   PetscErrorCode ierr;
8647c6ae99SBarry Smith   PetscInt       cnt;
8747c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
8847c6ae99SBarry Smith 
8947c6ae99SBarry Smith   PetscFunctionBegin;
9047c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
9147c6ae99SBarry Smith   PetscValidPointer(g,2);
9247c6ae99SBarry Smith   if (dd->natural) {
9347c6ae99SBarry Smith     ierr = PetscObjectGetReference((PetscObject)dd->natural,&cnt);CHKERRQ(ierr);
9447c6ae99SBarry Smith     if (cnt == 1) { /* object is not currently used by anyone */
9547c6ae99SBarry Smith       ierr = PetscObjectReference((PetscObject)dd->natural);CHKERRQ(ierr);
9647c6ae99SBarry Smith       *g   = dd->natural;
9747c6ae99SBarry Smith     } else {
9847c6ae99SBarry Smith       ierr = VecDuplicate(dd->natural,g);CHKERRQ(ierr);
9947c6ae99SBarry Smith     }
10047c6ae99SBarry Smith   } else { /* create the first version of this guy */
101*ce94432eSBarry Smith     ierr = VecCreate(PetscObjectComm((PetscObject)da),g);CHKERRQ(ierr);
102a34bdc0bSBarry Smith     ierr = VecSetSizes(*g,dd->Nlocal,PETSC_DETERMINE);CHKERRQ(ierr);
10347c6ae99SBarry Smith     ierr = VecSetBlockSize(*g, dd->w);CHKERRQ(ierr);
104a34bdc0bSBarry Smith     ierr = VecSetType(*g,VECMPI);CHKERRQ(ierr);
10547c6ae99SBarry Smith     ierr = PetscObjectReference((PetscObject)*g);CHKERRQ(ierr);
1068865f1eaSKarl Rupp 
10747c6ae99SBarry Smith     dd->natural = *g;
10847c6ae99SBarry Smith   }
10947c6ae99SBarry Smith   PetscFunctionReturn(0);
11047c6ae99SBarry Smith }
11147c6ae99SBarry Smith 
11247c6ae99SBarry Smith 
11347c6ae99SBarry Smith 
114