xref: /petsc/src/dm/impls/da/dadist.c (revision 7c8652dd9fb051dfaf30896d504f41ba028df3ea)
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 = VecSetDM(*g, da);CHKERRQ(ierr);
45     ierr = VecSetLocalToGlobalMapping(*g,da->ltogmap);CHKERRQ(ierr);
46     ierr = VecSetLocalToGlobalMappingBlock(*g,da->ltogmapb);CHKERRQ(ierr);
47   }
48   ierr = VecSetOperation(*g,VECOP_VIEW,(void (*)(void))VecView_MPI_DA);CHKERRQ(ierr);
49   ierr = VecSetOperation(*g,VECOP_LOAD,(void (*)(void))VecLoad_Default_DA);CHKERRQ(ierr);
50   ierr = VecSetOperation(*g,VECOP_DUPLICATE,(void (*)(void))VecDuplicate_MPI_DA);CHKERRQ(ierr);
51   PetscFunctionReturn(0);
52 }
53 
54 #undef __FUNCT__
55 #define __FUNCT__ "DMDACreateNaturalVector"
56 /*@
57    DMDACreateNaturalVector - Creates a parallel PETSc vector that
58    will hold vector values in the natural numbering, rather than in
59    the PETSc parallel numbering associated with the DMDA.
60 
61    Collective on DMDA
62 
63    Input Parameter:
64 .  da - the distributed array
65 
66    Output Parameter:
67 .  g - the distributed global vector
68 
69    Level: developer
70 
71    Note:
72    The output parameter, g, is a regular PETSc vector that should be destroyed
73    with a call to VecDestroy() when usage is finished.
74 
75    The number of local entries in the vector on each process is the same
76    as in a vector created with DMCreateGlobalVector().
77 
78 .keywords: distributed array, create, global, distributed, vector
79 
80 .seealso: DMCreateLocalVector(), VecDuplicate(), VecDuplicateVecs(),
81           DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToLocalBegin(),
82           DMGlobalToLocalEnd(), DMDALocalToGlobalBegin()
83 @*/
84 PetscErrorCode  DMDACreateNaturalVector(DM da,Vec *g)
85 {
86   PetscErrorCode ierr;
87   PetscInt       cnt;
88   DM_DA          *dd = (DM_DA*)da->data;
89 
90   PetscFunctionBegin;
91   PetscValidHeaderSpecific(da,DM_CLASSID,1);
92   PetscValidPointer(g,2);
93   if (dd->natural) {
94     ierr = PetscObjectGetReference((PetscObject)dd->natural,&cnt);CHKERRQ(ierr);
95     if (cnt == 1) { /* object is not currently used by anyone */
96       ierr = PetscObjectReference((PetscObject)dd->natural);CHKERRQ(ierr);
97       *g   = dd->natural;
98     } else {
99       ierr = VecDuplicate(dd->natural,g);CHKERRQ(ierr);
100     }
101   } else { /* create the first version of this guy */
102     ierr = VecCreate(PetscObjectComm((PetscObject)da),g);CHKERRQ(ierr);
103     ierr = VecSetSizes(*g,dd->Nlocal,PETSC_DETERMINE);CHKERRQ(ierr);
104     ierr = VecSetBlockSize(*g, dd->w);CHKERRQ(ierr);
105     ierr = VecSetType(*g,VECMPI);CHKERRQ(ierr);
106     ierr = PetscObjectReference((PetscObject)*g);CHKERRQ(ierr);
107 
108     dd->natural = *g;
109   }
110   PetscFunctionReturn(0);
111 }
112 
113 
114 
115