1
2 /*
3 Code for manipulating distributed regular arrays in parallel.
4 */
5
6 #include <petsc/private/dmdaimpl.h> /*I "petscdmda.h" I*/
7
VecDuplicate_MPI_DA(Vec g,Vec * gg)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
DMCreateGlobalVector_DA(DM da,Vec * g)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 ierr = VecCreate(PetscObjectComm((PetscObject)da),g);CHKERRQ(ierr);
32 ierr = VecSetSizes(*g,dd->Nlocal,PETSC_DETERMINE);CHKERRQ(ierr);
33 ierr = VecSetBlockSize(*g,dd->w);CHKERRQ(ierr);
34 ierr = VecSetType(*g,da->vectype);CHKERRQ(ierr);
35 ierr = VecSetDM(*g, da);CHKERRQ(ierr);
36 ierr = VecSetLocalToGlobalMapping(*g,da->ltogmap);CHKERRQ(ierr);
37 ierr = VecSetOperation(*g,VECOP_VIEW,(void (*)(void))VecView_MPI_DA);CHKERRQ(ierr);
38 ierr = VecSetOperation(*g,VECOP_LOAD,(void (*)(void))VecLoad_Default_DA);CHKERRQ(ierr);
39 ierr = VecSetOperation(*g,VECOP_DUPLICATE,(void (*)(void))VecDuplicate_MPI_DA);CHKERRQ(ierr);
40 PetscFunctionReturn(0);
41 }
42
43 /*@
44 DMDACreateNaturalVector - Creates a parallel PETSc vector that
45 will hold vector values in the natural numbering, rather than in
46 the PETSc parallel numbering associated with the DMDA.
47
48 Collective
49
50 Input Parameter:
51 . da - the distributed array
52
53 Output Parameter:
54 . g - the distributed global vector
55
56 Level: developer
57
58 Note:
59 The output parameter, g, is a regular PETSc vector that should be destroyed
60 with a call to VecDestroy() when usage is finished.
61
62 The number of local entries in the vector on each process is the same
63 as in a vector created with DMCreateGlobalVector().
64
65 .seealso: DMCreateLocalVector(), VecDuplicate(), VecDuplicateVecs(),
66 DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToLocalBegin(),
67 DMGlobalToLocalEnd(), DMLocalToGlobalBegin()
68 @*/
DMDACreateNaturalVector(DM da,Vec * g)69 PetscErrorCode DMDACreateNaturalVector(DM da,Vec *g)
70 {
71 PetscErrorCode ierr;
72 PetscInt cnt;
73 DM_DA *dd = (DM_DA*)da->data;
74
75 PetscFunctionBegin;
76 PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
77 PetscValidPointer(g,2);
78 if (dd->natural) {
79 ierr = PetscObjectGetReference((PetscObject)dd->natural,&cnt);CHKERRQ(ierr);
80 if (cnt == 1) { /* object is not currently used by anyone */
81 ierr = PetscObjectReference((PetscObject)dd->natural);CHKERRQ(ierr);
82 *g = dd->natural;
83 } else {
84 ierr = VecDuplicate(dd->natural,g);CHKERRQ(ierr);
85 }
86 } else { /* create the first version of this guy */
87 ierr = VecCreate(PetscObjectComm((PetscObject)da),g);CHKERRQ(ierr);
88 ierr = VecSetSizes(*g,dd->Nlocal,PETSC_DETERMINE);CHKERRQ(ierr);
89 ierr = VecSetBlockSize(*g, dd->w);CHKERRQ(ierr);
90 ierr = VecSetType(*g,da->vectype);CHKERRQ(ierr);
91 ierr = PetscObjectReference((PetscObject)*g);CHKERRQ(ierr);
92
93 dd->natural = *g;
94 }
95 PetscFunctionReturn(0);
96 }
97
98
99
100