xref: /petsc/src/dm/impls/da/dagtona.c (revision 1c2dc1cbabe5212f80cf309c4ca5a26f0cadc660)
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 
16d083f849SBarry 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   PetscInt       N;
3247c6ae99SBarry Smith   IS             from,to;
3347c6ae99SBarry Smith   Vec            tmplocal,global;
3447c6ae99SBarry Smith   AO             ao;
3547c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
3647c6ae99SBarry Smith 
3747c6ae99SBarry Smith   PetscFunctionBegin;
38a9a02de4SBarry Smith   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
3947c6ae99SBarry Smith   PetscValidPointer(scatter,2);
409566063dSJacob Faibussowitsch   PetscCall(DMDAGetAO(da,&ao));
4147c6ae99SBarry Smith 
4247c6ae99SBarry Smith   /* create the scatter context */
439566063dSJacob Faibussowitsch   PetscCall(VecCreateMPIWithArray(PetscObjectComm((PetscObject)da),dd->w,dd->Nlocal,PETSC_DETERMINE,NULL,&global));
449566063dSJacob Faibussowitsch   PetscCall(VecGetSize(global,&N));
459566063dSJacob Faibussowitsch   PetscCall(ISCreateStride(PetscObjectComm((PetscObject)da),N,0,1,&to));
469566063dSJacob Faibussowitsch   PetscCall(AOPetscToApplicationIS(ao,to));
479566063dSJacob Faibussowitsch   PetscCall(ISCreateStride(PetscObjectComm((PetscObject)da),N,0,1,&from));
489566063dSJacob Faibussowitsch   PetscCall(VecCreateSeqWithArray(PETSC_COMM_SELF,dd->w,N,NULL,&tmplocal));
499566063dSJacob Faibussowitsch   PetscCall(VecScatterCreate(global,from,tmplocal,to,scatter));
509566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tmplocal));
519566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&global));
529566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&from));
539566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&to));
5447c6ae99SBarry Smith   PetscFunctionReturn(0);
5547c6ae99SBarry Smith }
5647c6ae99SBarry Smith 
5747c6ae99SBarry Smith /*@
58aa219208SBarry Smith    DMDANaturalAllToGlobalCreate - Creates a scatter context that maps from a copy
5947c6ae99SBarry Smith      of the entire vector on each processor to its local part in the global vector.
6047c6ae99SBarry Smith 
61d083f849SBarry Smith    Collective on da
6247c6ae99SBarry Smith 
6347c6ae99SBarry Smith    Input Parameter:
6447c6ae99SBarry Smith .  da - the distributed array context
6547c6ae99SBarry Smith 
6647c6ae99SBarry Smith    Output Parameter:
6747c6ae99SBarry Smith .  scatter - the scatter context
6847c6ae99SBarry Smith 
6947c6ae99SBarry Smith    Level: advanced
7047c6ae99SBarry Smith 
71aa219208SBarry Smith .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
72aa219208SBarry Smith           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
7347c6ae99SBarry Smith @*/
747087cfbeSBarry Smith PetscErrorCode  DMDANaturalAllToGlobalCreate(DM da,VecScatter *scatter)
7547c6ae99SBarry Smith {
7647c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
7747c6ae99SBarry Smith   PetscInt       M,m = dd->Nlocal,start;
7847c6ae99SBarry Smith   IS             from,to;
7947c6ae99SBarry Smith   Vec            tmplocal,global;
8047c6ae99SBarry Smith   AO             ao;
8147c6ae99SBarry Smith 
8247c6ae99SBarry Smith   PetscFunctionBegin;
83a9a02de4SBarry Smith   PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA);
8447c6ae99SBarry Smith   PetscValidPointer(scatter,2);
859566063dSJacob Faibussowitsch   PetscCall(DMDAGetAO(da,&ao));
8647c6ae99SBarry Smith 
8747c6ae99SBarry Smith   /* create the scatter context */
88*1c2dc1cbSBarry Smith   PetscCall(MPIU_Allreduce(&m,&M,1,MPIU_INT,MPI_SUM,PetscObjectComm((PetscObject)da)));
899566063dSJacob Faibussowitsch   PetscCall(VecCreateMPIWithArray(PetscObjectComm((PetscObject)da),dd->w,m,PETSC_DETERMINE,NULL,&global));
909566063dSJacob Faibussowitsch   PetscCall(VecGetOwnershipRange(global,&start,NULL));
919566063dSJacob Faibussowitsch   PetscCall(ISCreateStride(PetscObjectComm((PetscObject)da),m,start,1,&from));
929566063dSJacob Faibussowitsch   PetscCall(AOPetscToApplicationIS(ao,from));
939566063dSJacob Faibussowitsch   PetscCall(ISCreateStride(PetscObjectComm((PetscObject)da),m,start,1,&to));
949566063dSJacob Faibussowitsch   PetscCall(VecCreateSeqWithArray(PETSC_COMM_SELF,dd->w,M,NULL,&tmplocal));
959566063dSJacob Faibussowitsch   PetscCall(VecScatterCreate(tmplocal,from,global,to,scatter));
969566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tmplocal));
979566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&global));
989566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&from));
999566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&to));
10047c6ae99SBarry Smith   PetscFunctionReturn(0);
10147c6ae99SBarry Smith }
102