xref: /petsc/src/dm/impls/da/dagtona.c (revision 84df9cb40eca90ea9b18a456fab7a4ecc7f6c1a4)
1 
2 /*
3      Tools to help solve the coarse grid problem redundantly.
4   Provides two scatter contexts that (1) map from the usual global vector
5   to all processors the entire vector in NATURAL numbering and (2)
6   from the entire vector on each processor in natural numbering extracts
7   out this processors piece in GLOBAL numbering
8 */
9 
10 #include <private/daimpl.h>    /*I   "petscdmda.h"   I*/
11 
12 #undef __FUNCT__
13 #define __FUNCT__ "DMDAGlobalToNaturalAllCreate"
14 /*@
15    DMDAGlobalToNaturalAllCreate - Creates a scatter context that maps from the
16      global vector the entire vector to each processor in natural numbering
17 
18    Collective on DMDA
19 
20    Input Parameter:
21 .  da - the distributed array context
22 
23    Output Parameter:
24 .  scatter - the scatter context
25 
26    Level: advanced
27 
28 .keywords: distributed array, global to local, begin, coarse problem
29 
30 .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
31           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
32 @*/
33 PetscErrorCode  DMDAGlobalToNaturalAllCreate(DM da,VecScatter *scatter)
34 {
35   PetscErrorCode ierr;
36   PetscInt       N;
37   IS             from,to;
38   Vec            tmplocal,global;
39   AO             ao;
40   DM_DA          *dd = (DM_DA*)da->data;
41 
42   PetscFunctionBegin;
43   PetscValidHeaderSpecific(da,DM_CLASSID,1);
44   PetscValidPointer(scatter,2);
45   ierr = DMDAGetAO(da,&ao);CHKERRQ(ierr);
46 
47   /* create the scatter context */
48   ierr = VecCreateMPIWithArray(((PetscObject)da)->comm,dd->Nlocal,PETSC_DETERMINE,0,&global);CHKERRQ(ierr);
49   ierr = VecGetSize(global,&N);CHKERRQ(ierr);
50   ierr = ISCreateStride(((PetscObject)da)->comm,N,0,1,&to);CHKERRQ(ierr);
51   ierr = AOPetscToApplicationIS(ao,to);CHKERRQ(ierr);
52   ierr = ISCreateStride(((PetscObject)da)->comm,N,0,1,&from);CHKERRQ(ierr);
53   ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,N,0,&tmplocal);CHKERRQ(ierr);
54   ierr = VecSetBlockSize(tmplocal,dd->w);CHKERRQ(ierr);
55   ierr = VecSetBlockSize(global,dd->w);CHKERRQ(ierr);
56   ierr = VecScatterCreate(global,from,tmplocal,to,scatter);CHKERRQ(ierr);
57   ierr = VecDestroy(&tmplocal);CHKERRQ(ierr);
58   ierr = VecDestroy(&global);CHKERRQ(ierr);
59   ierr = ISDestroy(&from);CHKERRQ(ierr);
60   ierr = ISDestroy(&to);CHKERRQ(ierr);
61   PetscFunctionReturn(0);
62 }
63 
64 #undef __FUNCT__
65 #define __FUNCT__ "DMDANaturalAllToGlobalCreate"
66 /*@
67    DMDANaturalAllToGlobalCreate - Creates a scatter context that maps from a copy
68      of the entire vector on each processor to its local part in the global vector.
69 
70    Collective on DMDA
71 
72    Input Parameter:
73 .  da - the distributed array context
74 
75    Output Parameter:
76 .  scatter - the scatter context
77 
78    Level: advanced
79 
80 .keywords: distributed array, global to local, begin, coarse problem
81 
82 .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
83           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
84 @*/
85 PetscErrorCode  DMDANaturalAllToGlobalCreate(DM da,VecScatter *scatter)
86 {
87   PetscErrorCode ierr;
88   DM_DA          *dd = (DM_DA*)da->data;
89   PetscInt       M,m = dd->Nlocal,start;
90   IS             from,to;
91   Vec            tmplocal,global;
92   AO             ao;
93 
94   PetscFunctionBegin;
95   PetscValidHeaderSpecific(da,DM_CLASSID,1);
96   PetscValidPointer(scatter,2);
97   ierr = DMDAGetAO(da,&ao);CHKERRQ(ierr);
98 
99   /* create the scatter context */
100   ierr = MPI_Allreduce(&m,&M,1,MPIU_INT,MPI_SUM,((PetscObject)da)->comm);CHKERRQ(ierr);
101   ierr = VecCreateMPIWithArray(((PetscObject)da)->comm,m,PETSC_DETERMINE,0,&global);CHKERRQ(ierr);
102   ierr = VecGetOwnershipRange(global,&start,PETSC_NULL);CHKERRQ(ierr);
103   ierr = ISCreateStride(((PetscObject)da)->comm,m,start,1,&from);CHKERRQ(ierr);
104   ierr = AOPetscToApplicationIS(ao,from);CHKERRQ(ierr);
105   ierr = ISCreateStride(((PetscObject)da)->comm,m,start,1,&to);CHKERRQ(ierr);
106   ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,M,0,&tmplocal);CHKERRQ(ierr);
107   ierr = VecSetBlockSize(tmplocal,dd->w);CHKERRQ(ierr);
108   ierr = VecSetBlockSize(global,dd->w);CHKERRQ(ierr);
109   ierr = VecScatterCreate(tmplocal,from,global,to,scatter);CHKERRQ(ierr);
110   ierr = VecDestroy(&tmplocal);CHKERRQ(ierr);
111   ierr = VecDestroy(&global);CHKERRQ(ierr);
112   ierr = ISDestroy(&from);CHKERRQ(ierr);
113   ierr = ISDestroy(&to);CHKERRQ(ierr);
114   PetscFunctionReturn(0);
115 }
116 
117