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