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