xref: /petsc/src/dm/impls/da/dagtona.c (revision 55e7fe800d976e85ed2b5cd8bfdef564daa37bd9)
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 <petsc/private/dmdaimpl.h>    /*I   "petscdmda.h"   I*/
11 
12 /*@
13    DMDAGlobalToNaturalAllCreate - Creates a scatter context that maps from the
14      global vector the entire vector to each processor in natural numbering
15 
16    Collective on DMDA
17 
18    Input Parameter:
19 .  da - the distributed array context
20 
21    Output Parameter:
22 .  scatter - the scatter context
23 
24    Level: advanced
25 
26 .keywords: distributed array, global to local, begin, coarse problem
27 
28 .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
29           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
30 @*/
31 PetscErrorCode  DMDAGlobalToNaturalAllCreate(DM da,VecScatter *scatter)
32 {
33   PetscErrorCode ierr;
34   PetscInt       N;
35   IS             from,to;
36   Vec            tmplocal,global;
37   AO             ao;
38   DM_DA          *dd = (DM_DA*)da->data;
39 
40   PetscFunctionBegin;
41   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
42   PetscValidPointer(scatter,2);
43   ierr = DMDAGetAO(da,&ao);CHKERRQ(ierr);
44 
45   /* create the scatter context */
46   ierr = VecCreateMPIWithArray(PetscObjectComm((PetscObject)da),dd->w,dd->Nlocal,PETSC_DETERMINE,0,&global);CHKERRQ(ierr);
47   ierr = VecGetSize(global,&N);CHKERRQ(ierr);
48   ierr = ISCreateStride(PetscObjectComm((PetscObject)da),N,0,1,&to);CHKERRQ(ierr);
49   ierr = AOPetscToApplicationIS(ao,to);CHKERRQ(ierr);
50   ierr = ISCreateStride(PetscObjectComm((PetscObject)da),N,0,1,&from);CHKERRQ(ierr);
51   ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,dd->w,N,0,&tmplocal);CHKERRQ(ierr);
52   ierr = VecScatterCreateWithData(global,from,tmplocal,to,scatter);CHKERRQ(ierr);
53   ierr = VecDestroy(&tmplocal);CHKERRQ(ierr);
54   ierr = VecDestroy(&global);CHKERRQ(ierr);
55   ierr = ISDestroy(&from);CHKERRQ(ierr);
56   ierr = ISDestroy(&to);CHKERRQ(ierr);
57   PetscFunctionReturn(0);
58 }
59 
60 /*@
61    DMDANaturalAllToGlobalCreate - Creates a scatter context that maps from a copy
62      of the entire vector on each processor to its local part in the global vector.
63 
64    Collective on DMDA
65 
66    Input Parameter:
67 .  da - the distributed array context
68 
69    Output Parameter:
70 .  scatter - the scatter context
71 
72    Level: advanced
73 
74 .keywords: distributed array, global to local, begin, coarse problem
75 
76 .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
77           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
78 @*/
79 PetscErrorCode  DMDANaturalAllToGlobalCreate(DM da,VecScatter *scatter)
80 {
81   PetscErrorCode ierr;
82   DM_DA          *dd = (DM_DA*)da->data;
83   PetscInt       M,m = dd->Nlocal,start;
84   IS             from,to;
85   Vec            tmplocal,global;
86   AO             ao;
87 
88   PetscFunctionBegin;
89   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
90   PetscValidPointer(scatter,2);
91   ierr = DMDAGetAO(da,&ao);CHKERRQ(ierr);
92 
93   /* create the scatter context */
94   ierr = MPIU_Allreduce(&m,&M,1,MPIU_INT,MPI_SUM,PetscObjectComm((PetscObject)da));CHKERRQ(ierr);
95   ierr = VecCreateMPIWithArray(PetscObjectComm((PetscObject)da),dd->w,m,PETSC_DETERMINE,0,&global);CHKERRQ(ierr);
96   ierr = VecGetOwnershipRange(global,&start,NULL);CHKERRQ(ierr);
97   ierr = ISCreateStride(PetscObjectComm((PetscObject)da),m,start,1,&from);CHKERRQ(ierr);
98   ierr = AOPetscToApplicationIS(ao,from);CHKERRQ(ierr);
99   ierr = ISCreateStride(PetscObjectComm((PetscObject)da),m,start,1,&to);CHKERRQ(ierr);
100   ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,dd->w,M,0,&tmplocal);CHKERRQ(ierr);
101   ierr = VecScatterCreateWithData(tmplocal,from,global,to,scatter);CHKERRQ(ierr);
102   ierr = VecDestroy(&tmplocal);CHKERRQ(ierr);
103   ierr = VecDestroy(&global);CHKERRQ(ierr);
104   ierr = ISDestroy(&from);CHKERRQ(ierr);
105   ierr = ISDestroy(&to);CHKERRQ(ierr);
106   PetscFunctionReturn(0);
107 }
108 
109