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