xref: /petsc/src/dm/impls/da/dadist.c (revision ccb4e88a40f0b86eaeca07ff64c64e4de2fae686)
1 
2 /*
3   Code for manipulating distributed regular arrays in parallel.
4 */
5 
6 #include <petsc/private/dmdaimpl.h>    /*I   "petscdmda.h"   I*/
7 
8 PetscErrorCode  VecDuplicate_MPI_DA(Vec g,Vec *gg)
9 {
10   PetscErrorCode ierr;
11   DM             da;
12   PetscLayout    map;
13 
14   PetscFunctionBegin;
15   ierr = VecGetDM(g, &da);CHKERRQ(ierr);
16   ierr = DMCreateGlobalVector(da,gg);CHKERRQ(ierr);
17   ierr = VecGetLayout(g,&map);CHKERRQ(ierr);
18   ierr = VecSetLayout(*gg,map);CHKERRQ(ierr);
19   PetscFunctionReturn(0);
20 }
21 
22 PetscErrorCode  DMCreateGlobalVector_DA(DM da,Vec *g)
23 {
24   PetscErrorCode ierr;
25   DM_DA          *dd = (DM_DA*)da->data;
26 
27   PetscFunctionBegin;
28   PetscValidHeaderSpecific(da,DM_CLASSID,1);
29   PetscValidPointer(g,2);
30   ierr = VecCreate(PetscObjectComm((PetscObject)da),g);CHKERRQ(ierr);
31   ierr = VecSetSizes(*g,dd->Nlocal,PETSC_DETERMINE);CHKERRQ(ierr);
32   ierr = VecSetBlockSize(*g,dd->w);CHKERRQ(ierr);
33   ierr = VecSetType(*g,da->vectype);CHKERRQ(ierr);
34   if (dd->Nlocal < da->bind_below) {
35     ierr = VecSetBindingPropagates(*g,PETSC_TRUE);CHKERRQ(ierr);
36     ierr = VecBindToCPU(*g,PETSC_TRUE);CHKERRQ(ierr);
37   }
38   ierr = VecSetDM(*g, da);CHKERRQ(ierr);
39   ierr = VecSetLocalToGlobalMapping(*g,da->ltogmap);CHKERRQ(ierr);
40   ierr = VecSetOperation(*g,VECOP_VIEW,(void (*)(void))VecView_MPI_DA);CHKERRQ(ierr);
41   ierr = VecSetOperation(*g,VECOP_LOAD,(void (*)(void))VecLoad_Default_DA);CHKERRQ(ierr);
42   ierr = VecSetOperation(*g,VECOP_DUPLICATE,(void (*)(void))VecDuplicate_MPI_DA);CHKERRQ(ierr);
43   PetscFunctionReturn(0);
44 }
45 
46 /*@
47    DMDACreateNaturalVector - Creates a parallel PETSc vector that
48    will hold vector values in the natural numbering, rather than in
49    the PETSc parallel numbering associated with the DMDA.
50 
51    Collective
52 
53    Input Parameter:
54 .  da - the distributed array
55 
56    Output Parameter:
57 .  g - the distributed global vector
58 
59    Level: developer
60 
61    Note:
62    The output parameter, g, is a regular PETSc vector that should be destroyed
63    with a call to VecDestroy() when usage is finished.
64 
65    The number of local entries in the vector on each process is the same
66    as in a vector created with DMCreateGlobalVector().
67 
68 .seealso: DMCreateLocalVector(), VecDuplicate(), VecDuplicateVecs(),
69           DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToLocalBegin(),
70           DMGlobalToLocalEnd(), DMLocalToGlobalBegin()
71 @*/
72 PetscErrorCode  DMDACreateNaturalVector(DM da,Vec *g)
73 {
74   PetscErrorCode ierr;
75   PetscInt       cnt;
76   DM_DA          *dd = (DM_DA*)da->data;
77 
78   PetscFunctionBegin;
79   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
80   PetscValidPointer(g,2);
81   if (dd->natural) {
82     ierr = PetscObjectGetReference((PetscObject)dd->natural,&cnt);CHKERRQ(ierr);
83     if (cnt == 1) { /* object is not currently used by anyone */
84       ierr = PetscObjectReference((PetscObject)dd->natural);CHKERRQ(ierr);
85       *g   = dd->natural;
86     } else {
87       ierr = VecDuplicate(dd->natural,g);CHKERRQ(ierr);
88     }
89   } else { /* create the first version of this guy */
90     ierr = VecCreate(PetscObjectComm((PetscObject)da),g);CHKERRQ(ierr);
91     ierr = VecSetSizes(*g,dd->Nlocal,PETSC_DETERMINE);CHKERRQ(ierr);
92     ierr = VecSetBlockSize(*g, dd->w);CHKERRQ(ierr);
93     ierr = VecSetType(*g,da->vectype);CHKERRQ(ierr);
94     ierr = PetscObjectReference((PetscObject)*g);CHKERRQ(ierr);
95 
96     dd->natural = *g;
97   }
98   PetscFunctionReturn(0);
99 }
100 
101