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