xref: /petsc/src/dm/impls/da/dagtona.c (revision d083f849a86f1f43e18d534ee43954e2786cb29a)
147c6ae99SBarry Smith 
247c6ae99SBarry Smith /*
347c6ae99SBarry Smith      Tools to help solve the coarse grid problem redundantly.
447c6ae99SBarry Smith   Provides two scatter contexts that (1) map from the usual global vector
547c6ae99SBarry Smith   to all processors the entire vector in NATURAL numbering and (2)
647c6ae99SBarry Smith   from the entire vector on each processor in natural numbering extracts
747c6ae99SBarry Smith   out this processors piece in GLOBAL numbering
847c6ae99SBarry Smith */
947c6ae99SBarry Smith 
10af0996ceSBarry Smith #include <petsc/private/dmdaimpl.h>    /*I   "petscdmda.h"   I*/
1147c6ae99SBarry Smith 
1247c6ae99SBarry Smith /*@
13aa219208SBarry Smith    DMDAGlobalToNaturalAllCreate - Creates a scatter context that maps from the
1447c6ae99SBarry Smith      global vector the entire vector to each processor in natural numbering
1547c6ae99SBarry Smith 
16*d083f849SBarry Smith    Collective on da
1747c6ae99SBarry Smith 
1847c6ae99SBarry Smith    Input Parameter:
1947c6ae99SBarry Smith .  da - the distributed array context
2047c6ae99SBarry Smith 
2147c6ae99SBarry Smith    Output Parameter:
2247c6ae99SBarry Smith .  scatter - the scatter context
2347c6ae99SBarry Smith 
2447c6ae99SBarry Smith    Level: advanced
2547c6ae99SBarry Smith 
26aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
27aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
2847c6ae99SBarry Smith @*/
297087cfbeSBarry Smith PetscErrorCode  DMDAGlobalToNaturalAllCreate(DM da,VecScatter *scatter)
3047c6ae99SBarry Smith {
3147c6ae99SBarry Smith   PetscErrorCode ierr;
3247c6ae99SBarry Smith   PetscInt       N;
3347c6ae99SBarry Smith   IS             from,to;
3447c6ae99SBarry Smith   Vec            tmplocal,global;
3547c6ae99SBarry Smith   AO             ao;
3647c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
3747c6ae99SBarry Smith 
3847c6ae99SBarry Smith   PetscFunctionBegin;
39a9a02de4SBarry Smith   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
4047c6ae99SBarry Smith   PetscValidPointer(scatter,2);
41aa219208SBarry Smith   ierr = DMDAGetAO(da,&ao);CHKERRQ(ierr);
4247c6ae99SBarry Smith 
4347c6ae99SBarry Smith   /* create the scatter context */
44ce94432eSBarry Smith   ierr = VecCreateMPIWithArray(PetscObjectComm((PetscObject)da),dd->w,dd->Nlocal,PETSC_DETERMINE,0,&global);CHKERRQ(ierr);
4547c6ae99SBarry Smith   ierr = VecGetSize(global,&N);CHKERRQ(ierr);
46ce94432eSBarry Smith   ierr = ISCreateStride(PetscObjectComm((PetscObject)da),N,0,1,&to);CHKERRQ(ierr);
4747c6ae99SBarry Smith   ierr = AOPetscToApplicationIS(ao,to);CHKERRQ(ierr);
48ce94432eSBarry Smith   ierr = ISCreateStride(PetscObjectComm((PetscObject)da),N,0,1,&from);CHKERRQ(ierr);
49778a2246SBarry Smith   ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,dd->w,N,0,&tmplocal);CHKERRQ(ierr);
509448b7f1SJunchao Zhang   ierr = VecScatterCreate(global,from,tmplocal,to,scatter);CHKERRQ(ierr);
51fcfd50ebSBarry Smith   ierr = VecDestroy(&tmplocal);CHKERRQ(ierr);
52fcfd50ebSBarry Smith   ierr = VecDestroy(&global);CHKERRQ(ierr);
53fcfd50ebSBarry Smith   ierr = ISDestroy(&from);CHKERRQ(ierr);
54fcfd50ebSBarry Smith   ierr = ISDestroy(&to);CHKERRQ(ierr);
5547c6ae99SBarry Smith   PetscFunctionReturn(0);
5647c6ae99SBarry Smith }
5747c6ae99SBarry Smith 
5847c6ae99SBarry Smith /*@
59aa219208SBarry Smith    DMDANaturalAllToGlobalCreate - Creates a scatter context that maps from a copy
6047c6ae99SBarry Smith      of the entire vector on each processor to its local part in the global vector.
6147c6ae99SBarry Smith 
62*d083f849SBarry Smith    Collective on da
6347c6ae99SBarry Smith 
6447c6ae99SBarry Smith    Input Parameter:
6547c6ae99SBarry Smith .  da - the distributed array context
6647c6ae99SBarry Smith 
6747c6ae99SBarry Smith    Output Parameter:
6847c6ae99SBarry Smith .  scatter - the scatter context
6947c6ae99SBarry Smith 
7047c6ae99SBarry Smith    Level: advanced
7147c6ae99SBarry Smith 
72aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
73aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
7447c6ae99SBarry Smith @*/
757087cfbeSBarry Smith PetscErrorCode  DMDANaturalAllToGlobalCreate(DM da,VecScatter *scatter)
7647c6ae99SBarry Smith {
7747c6ae99SBarry Smith   PetscErrorCode ierr;
7847c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
7947c6ae99SBarry Smith   PetscInt       M,m = dd->Nlocal,start;
8047c6ae99SBarry Smith   IS             from,to;
8147c6ae99SBarry Smith   Vec            tmplocal,global;
8247c6ae99SBarry Smith   AO             ao;
8347c6ae99SBarry Smith 
8447c6ae99SBarry Smith   PetscFunctionBegin;
85a9a02de4SBarry Smith   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
8647c6ae99SBarry Smith   PetscValidPointer(scatter,2);
87aa219208SBarry Smith   ierr = DMDAGetAO(da,&ao);CHKERRQ(ierr);
8847c6ae99SBarry Smith 
8947c6ae99SBarry Smith   /* create the scatter context */
90b2566f29SBarry Smith   ierr = MPIU_Allreduce(&m,&M,1,MPIU_INT,MPI_SUM,PetscObjectComm((PetscObject)da));CHKERRQ(ierr);
91ce94432eSBarry Smith   ierr = VecCreateMPIWithArray(PetscObjectComm((PetscObject)da),dd->w,m,PETSC_DETERMINE,0,&global);CHKERRQ(ierr);
920298fd71SBarry Smith   ierr = VecGetOwnershipRange(global,&start,NULL);CHKERRQ(ierr);
93ce94432eSBarry Smith   ierr = ISCreateStride(PetscObjectComm((PetscObject)da),m,start,1,&from);CHKERRQ(ierr);
9447c6ae99SBarry Smith   ierr = AOPetscToApplicationIS(ao,from);CHKERRQ(ierr);
95ce94432eSBarry Smith   ierr = ISCreateStride(PetscObjectComm((PetscObject)da),m,start,1,&to);CHKERRQ(ierr);
96778a2246SBarry Smith   ierr = VecCreateSeqWithArray(PETSC_COMM_SELF,dd->w,M,0,&tmplocal);CHKERRQ(ierr);
979448b7f1SJunchao Zhang   ierr = VecScatterCreate(tmplocal,from,global,to,scatter);CHKERRQ(ierr);
98fcfd50ebSBarry Smith   ierr = VecDestroy(&tmplocal);CHKERRQ(ierr);
99fcfd50ebSBarry Smith   ierr = VecDestroy(&global);CHKERRQ(ierr);
100fcfd50ebSBarry Smith   ierr = ISDestroy(&from);CHKERRQ(ierr);
101fcfd50ebSBarry Smith   ierr = ISDestroy(&to);CHKERRQ(ierr);
10247c6ae99SBarry Smith   PetscFunctionReturn(0);
10347c6ae99SBarry Smith }
10447c6ae99SBarry Smith 
105