xref: /petsc/src/dm/impls/da/dagtona.c (revision dce8aeba1c9b69b19f651c53d8a6b674bd7e9cbd)
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 
26*dce8aebaSBarry Smith .seealso: `DM`, `DMDA`, `DMDAGlobalToNaturalEnd()`, `DMLocalToGlobalBegin()`, `DMDACreate2d()`,
27db781477SPatrick Sanan           `DMGlobalToLocalBegin()`, `DMGlobalToLocalEnd()`, `DMDACreateNaturalVector()`
2847c6ae99SBarry Smith @*/
29d71ae5a4SJacob Faibussowitsch PetscErrorCode DMDAGlobalToNaturalAllCreate(DM da, VecScatter *scatter)
30d71ae5a4SJacob Faibussowitsch {
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 
71*dce8aebaSBarry Smith .seealso: `DM`, `DMDA`, `DMDAGlobalToNaturalEnd()`, `DMLocalToGlobalBegin()`, `DMDACreate2d()`,
72db781477SPatrick Sanan           `DMGlobalToLocalBegin()`, `DMGlobalToLocalEnd()`, `DMDACreateNaturalVector()`
7347c6ae99SBarry Smith @*/
74d71ae5a4SJacob Faibussowitsch PetscErrorCode DMDANaturalAllToGlobalCreate(DM da, VecScatter *scatter)
75d71ae5a4SJacob Faibussowitsch {
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 */
881c2dc1cbSBarry 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