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