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