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