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