xref: /petsc/src/vec/is/utils/pmap.c (revision 4ffacfe27a72f4cdf51b68a3bbb6aed96040fb2f)
169ce434fSBarry Smith 
269ce434fSBarry Smith /*
369ce434fSBarry Smith    This file contains routines for basic map object implementation.
469ce434fSBarry Smith */
569ce434fSBarry Smith 
657e2745dSVaclav Hapla #include <petsc/private/isimpl.h> /*I "petscis.h" I*/
75c25fcd7SBarry Smith 
8c3002683SMatthew G. Knepley /*@
9a8643c1eSVaclav Hapla   PetscLayoutCreate - Allocates PetscLayout space and sets the PetscLayout contents to the default.
1069ce434fSBarry Smith 
11d083f849SBarry Smith   Collective
1269ce434fSBarry Smith 
1369ce434fSBarry Smith   Input Parameters:
14a8643c1eSVaclav Hapla . comm - the MPI communicator
15a8643c1eSVaclav Hapla 
16a8643c1eSVaclav Hapla   Output Parameters:
17a8643c1eSVaclav Hapla . map - the new PetscLayout
1869ce434fSBarry Smith 
19456fcb79SJed Brown   Level: advanced
2069ce434fSBarry Smith 
21456fcb79SJed Brown   Notes:
22456fcb79SJed Brown   Typical calling sequence
23456fcb79SJed Brown .vb
2469ce434fSBarry Smith        PetscLayoutCreate(MPI_Comm,PetscLayout *);
25a8643c1eSVaclav Hapla        PetscLayoutSetBlockSize(PetscLayout,bs);
26a8643c1eSVaclav Hapla        PetscLayoutSetSize(PetscLayout,N); // or PetscLayoutSetLocalSize(PetscLayout,n);
2769ce434fSBarry Smith        PetscLayoutSetUp(PetscLayout);
28456fcb79SJed Brown .ve
299621ec18SVaclav Hapla   Alternatively,
30147403d9SBarry Smith .vb
31147403d9SBarry Smith       PetscLayoutCreateFromSizes(comm,n,N,bs,&layout);
32147403d9SBarry Smith .ve
339621ec18SVaclav Hapla 
34147403d9SBarry Smith   Optionally use any of the following
35147403d9SBarry Smith .vb
36147403d9SBarry Smith   PetscLayoutGetSize(PetscLayout,PetscInt *);
37147403d9SBarry Smith   PetscLayoutGetLocalSize(PetscLayout,PetscInt *);
38147403d9SBarry Smith   PetscLayoutGetRange(PetscLayout,PetscInt *rstart,PetscInt *rend);
39147403d9SBarry Smith   PetscLayoutGetRanges(PetscLayout,const PetscInt *range[]);
40147403d9SBarry Smith   PetscLayoutDestroy(PetscLayout*);
41147403d9SBarry Smith .ve
4269ce434fSBarry Smith 
436aad120cSJose E. Roman   The PetscLayout object and methods are intended to be used in the PETSc Vec and Mat implementations; it is often not needed in
4469ce434fSBarry Smith   user codes unless you really gain something in their use.
4569ce434fSBarry Smith 
46db781477SPatrick Sanan .seealso: `PetscLayoutSetLocalSize()`, `PetscLayoutSetSize()`, `PetscLayoutGetSize()`, `PetscLayoutGetLocalSize()`, `PetscLayout`, `PetscLayoutDestroy()`,
47db781477SPatrick Sanan           `PetscLayoutGetRange()`, `PetscLayoutGetRanges()`, `PetscLayoutSetBlockSize()`, `PetscLayoutGetBlockSize()`, `PetscLayoutSetUp()`,
48db781477SPatrick Sanan           `PetscLayoutCreateFromSizes()`
4969ce434fSBarry Smith 
5069ce434fSBarry Smith @*/
5169ce434fSBarry Smith PetscErrorCode PetscLayoutCreate(MPI_Comm comm,PetscLayout *map)
5269ce434fSBarry Smith {
5369ce434fSBarry Smith   PetscFunctionBegin;
549566063dSJacob Faibussowitsch   PetscCall(PetscNew(map));
559566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm, &(*map)->size));
5669ce434fSBarry Smith   (*map)->comm        = comm;
5769ce434fSBarry Smith   (*map)->bs          = -1;
5869ce434fSBarry Smith   (*map)->n           = -1;
5969ce434fSBarry Smith   (*map)->N           = -1;
60f92d6284SStefano Zampini   (*map)->range       = NULL;
619621ec18SVaclav Hapla   (*map)->range_alloc = PETSC_TRUE;
6269ce434fSBarry Smith   (*map)->rstart      = 0;
6369ce434fSBarry Smith   (*map)->rend        = 0;
64ca5434daSLawrence Mitchell   (*map)->setupcalled = PETSC_FALSE;
65ca5434daSLawrence Mitchell   (*map)->oldn        = -1;
66ca5434daSLawrence Mitchell   (*map)->oldN        = -1;
67ca5434daSLawrence Mitchell   (*map)->oldbs       = -1;
6869ce434fSBarry Smith   PetscFunctionReturn(0);
6969ce434fSBarry Smith }
7069ce434fSBarry Smith 
71c3002683SMatthew G. Knepley /*@
729621ec18SVaclav Hapla   PetscLayoutCreateFromSizes - Allocates PetscLayout space, sets the layout sizes, and sets the layout up.
739621ec18SVaclav Hapla 
749621ec18SVaclav Hapla   Collective
759621ec18SVaclav Hapla 
769621ec18SVaclav Hapla   Input Parameters:
779621ec18SVaclav Hapla + comm  - the MPI communicator
789621ec18SVaclav Hapla . n     - the local size (or PETSC_DECIDE)
799621ec18SVaclav Hapla . N     - the global size (or PETSC_DECIDE)
80f0fc11ceSJed Brown - bs    - the block size (or PETSC_DECIDE)
819621ec18SVaclav Hapla 
829621ec18SVaclav Hapla   Output Parameters:
839621ec18SVaclav Hapla . map - the new PetscLayout
849621ec18SVaclav Hapla 
859621ec18SVaclav Hapla   Level: advanced
869621ec18SVaclav Hapla 
879621ec18SVaclav Hapla   Notes:
889621ec18SVaclav Hapla $ PetscLayoutCreateFromSizes(comm,n,N,bs,&layout);
899621ec18SVaclav Hapla   is a shorthand for
909621ec18SVaclav Hapla .vb
919621ec18SVaclav Hapla   PetscLayoutCreate(comm,&layout);
929621ec18SVaclav Hapla   PetscLayoutSetLocalSize(layout,n);
939621ec18SVaclav Hapla   PetscLayoutSetSize(layout,N);
949621ec18SVaclav Hapla   PetscLayoutSetBlockSize(layout,bs);
959621ec18SVaclav Hapla   PetscLayoutSetUp(layout);
969621ec18SVaclav Hapla .ve
979621ec18SVaclav Hapla 
98db781477SPatrick Sanan .seealso: `PetscLayoutCreate()`, `PetscLayoutSetLocalSize()`, `PetscLayoutSetSize()`, `PetscLayoutGetSize()`, `PetscLayoutGetLocalSize()`, `PetscLayout`, `PetscLayoutDestroy()`,
99db781477SPatrick Sanan           `PetscLayoutGetRange()`, `PetscLayoutGetRanges()`, `PetscLayoutSetBlockSize()`, `PetscLayoutGetBlockSize()`, `PetscLayoutSetUp()`, `PetscLayoutCreateFromRanges()`
1009621ec18SVaclav Hapla 
1019621ec18SVaclav Hapla @*/
1029621ec18SVaclav Hapla PetscErrorCode PetscLayoutCreateFromSizes(MPI_Comm comm,PetscInt n,PetscInt N,PetscInt bs,PetscLayout *map)
1039621ec18SVaclav Hapla {
1049621ec18SVaclav Hapla   PetscFunctionBegin;
1059566063dSJacob Faibussowitsch   PetscCall(PetscLayoutCreate(comm, map));
1069566063dSJacob Faibussowitsch   PetscCall(PetscLayoutSetLocalSize(*map, n));
1079566063dSJacob Faibussowitsch   PetscCall(PetscLayoutSetSize(*map, N));
1089566063dSJacob Faibussowitsch   PetscCall(PetscLayoutSetBlockSize(*map, bs));
1099566063dSJacob Faibussowitsch   PetscCall(PetscLayoutSetUp(*map));
1109621ec18SVaclav Hapla   PetscFunctionReturn(0);
1119621ec18SVaclav Hapla }
1129621ec18SVaclav Hapla 
1139621ec18SVaclav Hapla /*@
11469ce434fSBarry Smith   PetscLayoutDestroy - Frees a map object and frees its range if that exists.
11569ce434fSBarry Smith 
116d083f849SBarry Smith   Collective
11769ce434fSBarry Smith 
11869ce434fSBarry Smith   Input Parameters:
11969ce434fSBarry Smith . map - the PetscLayout
12069ce434fSBarry Smith 
12169ce434fSBarry Smith   Level: developer
12269ce434fSBarry Smith 
123c3002683SMatthew G. Knepley   Note:
1246aad120cSJose E. Roman   The PetscLayout object and methods are intended to be used in the PETSc Vec and Mat implementations; it is
12569ce434fSBarry Smith   recommended they not be used in user codes unless you really gain something in their use.
12669ce434fSBarry Smith 
127db781477SPatrick Sanan .seealso: `PetscLayoutSetLocalSize()`, `PetscLayoutSetSize()`, `PetscLayoutGetSize()`, `PetscLayoutGetLocalSize()`, `PetscLayout`, `PetscLayoutCreate()`,
128db781477SPatrick Sanan           `PetscLayoutGetRange()`, `PetscLayoutGetRanges()`, `PetscLayoutSetBlockSize()`, `PetscLayoutGetBlockSize()`, `PetscLayoutSetUp()`
12969ce434fSBarry Smith 
13069ce434fSBarry Smith @*/
13169ce434fSBarry Smith PetscErrorCode PetscLayoutDestroy(PetscLayout *map)
13269ce434fSBarry Smith {
13369ce434fSBarry Smith   PetscFunctionBegin;
13469ce434fSBarry Smith   if (!*map) PetscFunctionReturn(0);
13569ce434fSBarry Smith   if (!(*map)->refcnt--) {
1369566063dSJacob Faibussowitsch     if ((*map)->range_alloc) PetscCall(PetscFree((*map)->range));
1379566063dSJacob Faibussowitsch     PetscCall(ISLocalToGlobalMappingDestroy(&(*map)->mapping));
1389566063dSJacob Faibussowitsch     PetscCall(PetscFree((*map)));
13969ce434fSBarry Smith   }
14069ce434fSBarry Smith   *map = NULL;
14169ce434fSBarry Smith   PetscFunctionReturn(0);
14269ce434fSBarry Smith }
14369ce434fSBarry Smith 
1449621ec18SVaclav Hapla /*@
1459621ec18SVaclav Hapla   PetscLayoutCreateFromRanges - Creates a new PetscLayout with the given ownership ranges and sets it up.
1469621ec18SVaclav Hapla 
1479621ec18SVaclav Hapla   Collective
1489621ec18SVaclav Hapla 
1499621ec18SVaclav Hapla   Input Parameters:
1509621ec18SVaclav Hapla + comm  - the MPI communicator
1519621ec18SVaclav Hapla . range - the array of ownership ranges for each rank with length commsize+1
1529621ec18SVaclav Hapla . mode  - the copy mode for range
1539621ec18SVaclav Hapla - bs    - the block size (or PETSC_DECIDE)
1549621ec18SVaclav Hapla 
1559621ec18SVaclav Hapla   Output Parameters:
1569621ec18SVaclav Hapla . newmap - the new PetscLayout
1579621ec18SVaclav Hapla 
1589621ec18SVaclav Hapla   Level: developer
1599621ec18SVaclav Hapla 
160db781477SPatrick Sanan .seealso: `PetscLayoutCreate()`, `PetscLayoutSetLocalSize()`, `PetscLayoutSetSize()`, `PetscLayoutGetSize()`, `PetscLayoutGetLocalSize()`, `PetscLayout`, `PetscLayoutDestroy()`,
161db781477SPatrick Sanan           `PetscLayoutGetRange()`, `PetscLayoutGetRanges()`, `PetscLayoutSetBlockSize()`, `PetscLayoutGetBlockSize()`, `PetscLayoutSetUp()`, `PetscLayoutCreateFromSizes()`
1629621ec18SVaclav Hapla 
1639621ec18SVaclav Hapla @*/
1649621ec18SVaclav Hapla PetscErrorCode PetscLayoutCreateFromRanges(MPI_Comm comm,const PetscInt range[],PetscCopyMode mode,PetscInt bs,PetscLayout *newmap)
1657b659617SVaclav Hapla {
1669621ec18SVaclav Hapla   PetscLayout    map;
16738a25198SStefano Zampini   PetscMPIInt    rank;
1687b659617SVaclav Hapla 
1697b659617SVaclav Hapla   PetscFunctionBegin;
1709566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm, &rank));
1719566063dSJacob Faibussowitsch   PetscCall(PetscLayoutCreate(comm, &map));
1729566063dSJacob Faibussowitsch   PetscCall(PetscLayoutSetBlockSize(map, bs));
1739621ec18SVaclav Hapla   switch (mode) {
1749621ec18SVaclav Hapla     case PETSC_COPY_VALUES:
1759566063dSJacob Faibussowitsch       PetscCall(PetscMalloc1(map->size+1, &map->range));
1769566063dSJacob Faibussowitsch       PetscCall(PetscArraycpy(map->range, range, map->size+1));
1779621ec18SVaclav Hapla       break;
1789621ec18SVaclav Hapla     case PETSC_USE_POINTER:
1799621ec18SVaclav Hapla       map->range_alloc = PETSC_FALSE;
1809621ec18SVaclav Hapla     default:
1819621ec18SVaclav Hapla       map->range = (PetscInt*) range;
1829621ec18SVaclav Hapla       break;
1839621ec18SVaclav Hapla   }
1847b659617SVaclav Hapla   map->rstart = map->range[rank];
1857b659617SVaclav Hapla   map->rend   = map->range[rank+1];
1867b659617SVaclav Hapla   map->n      = map->rend - map->rstart;
18738a25198SStefano Zampini   map->N      = map->range[map->size];
18876bd3646SJed Brown   if (PetscDefined(USE_DEBUG)) {  /* just check that n, N and bs are consistent */
1897b659617SVaclav Hapla     PetscInt tmp;
1901c2dc1cbSBarry Smith     PetscCall(MPIU_Allreduce(&map->n,&tmp,1,MPIU_INT,MPI_SUM,map->comm));
19108401ef6SPierre Jolivet     PetscCheck(tmp == map->N,PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Sum of local lengths %" PetscInt_FMT " does not equal global length %" PetscInt_FMT ", my local length %" PetscInt_FMT ".\nThe provided PetscLayout is wrong.",tmp,map->N,map->n);
1927b659617SVaclav Hapla     if (map->bs > 1) {
19308401ef6SPierre Jolivet       PetscCheck(map->n % map->bs == 0,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Local size %" PetscInt_FMT " must be divisible by blocksize %" PetscInt_FMT,map->n,map->bs);
1947b659617SVaclav Hapla     }
1957b659617SVaclav Hapla     if (map->bs > 1) {
19608401ef6SPierre Jolivet       PetscCheck(map->N % map->bs == 0,map->comm,PETSC_ERR_PLIB,"Global size %" PetscInt_FMT " must be divisible by blocksize %" PetscInt_FMT,map->N,map->bs);
1977b659617SVaclav Hapla     }
19876bd3646SJed Brown   }
199ca5434daSLawrence Mitchell   /* lock the layout */
200ca5434daSLawrence Mitchell   map->setupcalled = PETSC_TRUE;
201ca5434daSLawrence Mitchell   map->oldn = map->n;
202ca5434daSLawrence Mitchell   map->oldN = map->N;
203ca5434daSLawrence Mitchell   map->oldbs = map->bs;
2049621ec18SVaclav Hapla   *newmap = map;
2057b659617SVaclav Hapla   PetscFunctionReturn(0);
2067b659617SVaclav Hapla }
2077b659617SVaclav Hapla 
208c3002683SMatthew G. Knepley /*@
20969ce434fSBarry Smith   PetscLayoutSetUp - given a map where you have set either the global or local
21069ce434fSBarry Smith                      size sets up the map so that it may be used.
21169ce434fSBarry Smith 
212d083f849SBarry Smith   Collective
21369ce434fSBarry Smith 
21469ce434fSBarry Smith   Input Parameters:
21569ce434fSBarry Smith . map - pointer to the map
21669ce434fSBarry Smith 
21769ce434fSBarry Smith   Level: developer
21869ce434fSBarry Smith 
21995452b02SPatrick Sanan   Notes:
22095452b02SPatrick Sanan     Typical calling sequence
221c3002683SMatthew G. Knepley $ PetscLayoutCreate(MPI_Comm,PetscLayout *);
222c3002683SMatthew G. Knepley $ PetscLayoutSetBlockSize(PetscLayout,1);
223c3002683SMatthew G. Knepley $ PetscLayoutSetSize(PetscLayout,n) or PetscLayoutSetLocalSize(PetscLayout,N); or both
224c3002683SMatthew G. Knepley $ PetscLayoutSetUp(PetscLayout);
225c3002683SMatthew G. Knepley $ PetscLayoutGetSize(PetscLayout,PetscInt *);
22669ce434fSBarry Smith 
2277b659617SVaclav Hapla   If range exists, and local size is not set, everything gets computed from the range.
22869ce434fSBarry Smith 
22969ce434fSBarry Smith   If the local size, global size are already set and range exists then this does nothing.
23069ce434fSBarry Smith 
231db781477SPatrick Sanan .seealso: `PetscLayoutSetLocalSize()`, `PetscLayoutSetSize()`, `PetscLayoutGetSize()`, `PetscLayoutGetLocalSize()`, `PetscLayout`, `PetscLayoutDestroy()`,
232db781477SPatrick Sanan           `PetscLayoutGetRange()`, `PetscLayoutGetRanges()`, `PetscLayoutSetBlockSize()`, `PetscLayoutGetBlockSize()`, `PetscLayoutCreate()`
23369ce434fSBarry Smith @*/
23469ce434fSBarry Smith PetscErrorCode PetscLayoutSetUp(PetscLayout map)
23569ce434fSBarry Smith {
23638a25198SStefano Zampini   PetscMPIInt    rank;
23769ce434fSBarry Smith   PetscInt       p;
23869ce434fSBarry Smith 
23969ce434fSBarry Smith   PetscFunctionBegin;
24008401ef6SPierre Jolivet   PetscCheck(!map->setupcalled || !(map->n != map->oldn || map->N != map->oldN),map->comm,PETSC_ERR_ARG_WRONGSTATE,"Layout is already setup with (local=%" PetscInt_FMT ",global=%" PetscInt_FMT "), cannot call setup again with (local=%" PetscInt_FMT ",global=%" PetscInt_FMT ")", map->oldn, map->oldN, map->n, map->N);
241ca5434daSLawrence Mitchell   if (map->setupcalled) PetscFunctionReturn(0);
24269ce434fSBarry Smith 
243b146b01cSBarry Smith   if (map->n > 0 && map->bs > 1) {
24408401ef6SPierre Jolivet     PetscCheck(map->n % map->bs == 0,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Local size %" PetscInt_FMT " must be divisible by blocksize %" PetscInt_FMT,map->n,map->bs);
245b146b01cSBarry Smith   }
246b146b01cSBarry Smith   if (map->N > 0 && map->bs > 1) {
24708401ef6SPierre Jolivet     PetscCheck(map->N % map->bs == 0,map->comm,PETSC_ERR_PLIB,"Global size %" PetscInt_FMT " must be divisible by blocksize %" PetscInt_FMT,map->N,map->bs);
248b146b01cSBarry Smith   }
249b146b01cSBarry Smith 
2509566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(map->comm, &rank));
25133d57670SJed Brown   if (map->n > 0) map->n = map->n/PetscAbs(map->bs);
25233d57670SJed Brown   if (map->N > 0) map->N = map->N/PetscAbs(map->bs);
2539566063dSJacob Faibussowitsch   PetscCall(PetscSplitOwnership(map->comm,&map->n,&map->N));
25433d57670SJed Brown   map->n = map->n*PetscAbs(map->bs);
25533d57670SJed Brown   map->N = map->N*PetscAbs(map->bs);
25669ce434fSBarry Smith   if (!map->range) {
2579566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(map->size+1, &map->range));
25869ce434fSBarry Smith   }
2599566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Allgather(&map->n, 1, MPIU_INT, map->range+1, 1, MPIU_INT, map->comm));
26069ce434fSBarry Smith 
26169ce434fSBarry Smith   map->range[0] = 0;
26238a25198SStefano Zampini   for (p = 2; p <= map->size; p++) map->range[p] += map->range[p-1];
26369ce434fSBarry Smith 
26469ce434fSBarry Smith   map->rstart = map->range[rank];
26569ce434fSBarry Smith   map->rend   = map->range[rank+1];
266ca5434daSLawrence Mitchell 
267ca5434daSLawrence Mitchell   /* lock the layout */
268ca5434daSLawrence Mitchell   map->setupcalled = PETSC_TRUE;
269ca5434daSLawrence Mitchell   map->oldn = map->n;
270ca5434daSLawrence Mitchell   map->oldN = map->N;
271ca5434daSLawrence Mitchell   map->oldbs = map->bs;
27269ce434fSBarry Smith   PetscFunctionReturn(0);
27369ce434fSBarry Smith }
27469ce434fSBarry Smith 
275c3002683SMatthew G. Knepley /*@
27669ce434fSBarry Smith   PetscLayoutDuplicate - creates a new PetscLayout with the same information as a given one. If the PetscLayout already exists it is destroyed first.
27769ce434fSBarry Smith 
27869ce434fSBarry Smith   Collective on PetscLayout
27969ce434fSBarry Smith 
28069ce434fSBarry Smith   Input Parameter:
28169ce434fSBarry Smith . in - input PetscLayout to be duplicated
28269ce434fSBarry Smith 
28369ce434fSBarry Smith   Output Parameter:
28469ce434fSBarry Smith . out - the copy
28569ce434fSBarry Smith 
28669ce434fSBarry Smith   Level: developer
28769ce434fSBarry Smith 
28895452b02SPatrick Sanan   Notes:
28995452b02SPatrick Sanan     PetscLayoutSetUp() does not need to be called on the resulting PetscLayout
29069ce434fSBarry Smith 
291db781477SPatrick Sanan .seealso: `PetscLayoutCreate()`, `PetscLayoutDestroy()`, `PetscLayoutSetUp()`, `PetscLayoutReference()`
29269ce434fSBarry Smith @*/
29369ce434fSBarry Smith PetscErrorCode PetscLayoutDuplicate(PetscLayout in,PetscLayout *out)
29469ce434fSBarry Smith {
29569ce434fSBarry Smith   MPI_Comm       comm = in->comm;
29669ce434fSBarry Smith 
29769ce434fSBarry Smith   PetscFunctionBegin;
2989566063dSJacob Faibussowitsch   PetscCall(PetscLayoutDestroy(out));
2999566063dSJacob Faibussowitsch   PetscCall(PetscLayoutCreate(comm,out));
3009566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(*out,in,sizeof(struct _n_PetscLayout)));
301c168f6d8SVaclav Hapla   if (in->range) {
3029566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1((*out)->size+1,&(*out)->range));
3039566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy((*out)->range,in->range,(*out)->size+1));
304c168f6d8SVaclav Hapla   }
30569ce434fSBarry Smith   (*out)->refcnt = 0;
30669ce434fSBarry Smith   PetscFunctionReturn(0);
30769ce434fSBarry Smith }
30869ce434fSBarry Smith 
309c3002683SMatthew G. Knepley /*@
31069ce434fSBarry Smith   PetscLayoutReference - Causes a PETSc Vec or Mat to share a PetscLayout with one that already exists. Used by Vec/MatDuplicate_XXX()
31169ce434fSBarry Smith 
31269ce434fSBarry Smith   Collective on PetscLayout
31369ce434fSBarry Smith 
31469ce434fSBarry Smith   Input Parameter:
31569ce434fSBarry Smith . in - input PetscLayout to be copied
31669ce434fSBarry Smith 
31769ce434fSBarry Smith   Output Parameter:
31869ce434fSBarry Smith . out - the reference location
31969ce434fSBarry Smith 
32069ce434fSBarry Smith   Level: developer
32169ce434fSBarry Smith 
32295452b02SPatrick Sanan   Notes:
32395452b02SPatrick Sanan     PetscLayoutSetUp() does not need to be called on the resulting PetscLayout
32469ce434fSBarry Smith 
32569ce434fSBarry Smith   If the out location already contains a PetscLayout it is destroyed
32669ce434fSBarry Smith 
327db781477SPatrick Sanan .seealso: `PetscLayoutCreate()`, `PetscLayoutDestroy()`, `PetscLayoutSetUp()`, `PetscLayoutDuplicate()`
32869ce434fSBarry Smith @*/
32969ce434fSBarry Smith PetscErrorCode PetscLayoutReference(PetscLayout in,PetscLayout *out)
33069ce434fSBarry Smith {
33169ce434fSBarry Smith   PetscFunctionBegin;
33269ce434fSBarry Smith   in->refcnt++;
3339566063dSJacob Faibussowitsch   PetscCall(PetscLayoutDestroy(out));
33469ce434fSBarry Smith   *out = in;
33569ce434fSBarry Smith   PetscFunctionReturn(0);
33669ce434fSBarry Smith }
33769ce434fSBarry Smith 
338c3002683SMatthew G. Knepley /*@
33969ce434fSBarry Smith   PetscLayoutSetISLocalToGlobalMapping - sets a ISLocalGlobalMapping into a PetscLayout
34069ce434fSBarry Smith 
34169ce434fSBarry Smith   Collective on PetscLayout
34269ce434fSBarry Smith 
343d8d19677SJose E. Roman   Input Parameters:
34469ce434fSBarry Smith + in - input PetscLayout
34569ce434fSBarry Smith - ltog - the local to global mapping
34669ce434fSBarry Smith 
34769ce434fSBarry Smith   Level: developer
34869ce434fSBarry Smith 
34995452b02SPatrick Sanan   Notes:
35095452b02SPatrick Sanan     PetscLayoutSetUp() does not need to be called on the resulting PetscLayout
35169ce434fSBarry Smith 
35269ce434fSBarry Smith   If the ltog location already contains a PetscLayout it is destroyed
35369ce434fSBarry Smith 
354db781477SPatrick Sanan .seealso: `PetscLayoutCreate()`, `PetscLayoutDestroy()`, `PetscLayoutSetUp()`, `PetscLayoutDuplicate()`
35569ce434fSBarry Smith @*/
35669ce434fSBarry Smith PetscErrorCode PetscLayoutSetISLocalToGlobalMapping(PetscLayout in,ISLocalToGlobalMapping ltog)
35769ce434fSBarry Smith {
35869ce434fSBarry Smith   PetscFunctionBegin;
359fc989267SStefano Zampini   if (ltog) {
360fc989267SStefano Zampini     PetscInt bs;
361fc989267SStefano Zampini 
3629566063dSJacob Faibussowitsch     PetscCall(ISLocalToGlobalMappingGetBlockSize(ltog,&bs));
363c9cc58a2SBarry Smith     PetscCheck(in->bs <= 0 || bs == 1 || in->bs == bs,in->comm,PETSC_ERR_PLIB,"Blocksize of layout %" PetscInt_FMT " must match that of mapping %" PetscInt_FMT " (or the latter must be 1)",in->bs,bs);
3649566063dSJacob Faibussowitsch     PetscCall(PetscObjectReference((PetscObject)ltog));
365fc989267SStefano Zampini   }
3669566063dSJacob Faibussowitsch   PetscCall(ISLocalToGlobalMappingDestroy(&in->mapping));
36769ce434fSBarry Smith   in->mapping = ltog;
36869ce434fSBarry Smith   PetscFunctionReturn(0);
36969ce434fSBarry Smith }
37069ce434fSBarry Smith 
371c3002683SMatthew G. Knepley /*@
37269ce434fSBarry Smith   PetscLayoutSetLocalSize - Sets the local size for a PetscLayout object.
37369ce434fSBarry Smith 
37469ce434fSBarry Smith   Collective on PetscLayout
37569ce434fSBarry Smith 
37669ce434fSBarry Smith   Input Parameters:
37769ce434fSBarry Smith + map - pointer to the map
37869ce434fSBarry Smith - n - the local size
37969ce434fSBarry Smith 
38069ce434fSBarry Smith   Level: developer
38169ce434fSBarry Smith 
38269ce434fSBarry Smith   Notes:
38369ce434fSBarry Smith   Call this after the call to PetscLayoutCreate()
38469ce434fSBarry Smith 
385db781477SPatrick Sanan .seealso: `PetscLayoutCreate()`, `PetscLayoutSetSize()`, `PetscLayoutGetSize()`, `PetscLayoutGetLocalSize()`, `PetscLayoutSetUp()`
386db781477SPatrick Sanan           `PetscLayoutGetRange()`, `PetscLayoutGetRanges()`, `PetscLayoutSetBlockSize()`, `PetscLayoutGetBlockSize()`
38769ce434fSBarry Smith @*/
38869ce434fSBarry Smith PetscErrorCode PetscLayoutSetLocalSize(PetscLayout map,PetscInt n)
38969ce434fSBarry Smith {
39069ce434fSBarry Smith   PetscFunctionBegin;
391c9cc58a2SBarry Smith   PetscCheck(map->bs <= 1 || (n % map->bs) == 0,map->comm,PETSC_ERR_ARG_INCOMP,"Local size %" PetscInt_FMT " not compatible with block size %" PetscInt_FMT,n,map->bs);
39269ce434fSBarry Smith   map->n = n;
39369ce434fSBarry Smith   PetscFunctionReturn(0);
39469ce434fSBarry Smith }
39569ce434fSBarry Smith 
396*4ffacfe2SAlexis Marboeuf /*@
39769ce434fSBarry Smith      PetscLayoutGetLocalSize - Gets the local size for a PetscLayout object.
39869ce434fSBarry Smith 
39969ce434fSBarry Smith     Not Collective
40069ce434fSBarry Smith 
40169ce434fSBarry Smith    Input Parameters:
40269ce434fSBarry Smith .    map - pointer to the map
40369ce434fSBarry Smith 
40469ce434fSBarry Smith    Output Parameters:
40569ce434fSBarry Smith .    n - the local size
40669ce434fSBarry Smith 
40769ce434fSBarry Smith    Level: developer
40869ce434fSBarry Smith 
40969ce434fSBarry Smith     Notes:
41069ce434fSBarry Smith        Call this after the call to PetscLayoutSetUp()
41169ce434fSBarry Smith 
41269ce434fSBarry Smith     Fortran Notes:
41369ce434fSBarry Smith       Not available from Fortran
41469ce434fSBarry Smith 
415db781477SPatrick Sanan .seealso: `PetscLayoutCreate()`, `PetscLayoutSetSize()`, `PetscLayoutGetSize()`, `PetscLayoutGetLocalSize()`, `PetscLayoutSetUp()`
416db781477SPatrick Sanan           `PetscLayoutGetRange()`, `PetscLayoutGetRanges()`, `PetscLayoutSetBlockSize()`, `PetscLayoutGetBlockSize()`
41769ce434fSBarry Smith 
41869ce434fSBarry Smith @*/
41969ce434fSBarry Smith PetscErrorCode  PetscLayoutGetLocalSize(PetscLayout map,PetscInt *n)
42069ce434fSBarry Smith {
42169ce434fSBarry Smith   PetscFunctionBegin;
42269ce434fSBarry Smith   *n = map->n;
42369ce434fSBarry Smith   PetscFunctionReturn(0);
42469ce434fSBarry Smith }
42569ce434fSBarry Smith 
426c3002683SMatthew G. Knepley /*@
42769ce434fSBarry Smith   PetscLayoutSetSize - Sets the global size for a PetscLayout object.
42869ce434fSBarry Smith 
42969ce434fSBarry Smith   Logically Collective on PetscLayout
43069ce434fSBarry Smith 
43169ce434fSBarry Smith   Input Parameters:
43269ce434fSBarry Smith + map - pointer to the map
43369ce434fSBarry Smith - n - the global size
43469ce434fSBarry Smith 
43569ce434fSBarry Smith   Level: developer
43669ce434fSBarry Smith 
43769ce434fSBarry Smith   Notes:
43869ce434fSBarry Smith   Call this after the call to PetscLayoutCreate()
43969ce434fSBarry Smith 
440db781477SPatrick Sanan .seealso: `PetscLayoutCreate()`, `PetscLayoutSetLocalSize()`, `PetscLayoutGetLocalSize()`, `PetscLayoutGetSize()`, `PetscLayoutSetUp()`
441db781477SPatrick Sanan           `PetscLayoutGetRange()`, `PetscLayoutGetRanges()`, `PetscLayoutSetBlockSize()`, `PetscLayoutGetBlockSize()`
44269ce434fSBarry Smith @*/
44369ce434fSBarry Smith PetscErrorCode PetscLayoutSetSize(PetscLayout map,PetscInt n)
44469ce434fSBarry Smith {
44569ce434fSBarry Smith   PetscFunctionBegin;
44669ce434fSBarry Smith   map->N = n;
44769ce434fSBarry Smith   PetscFunctionReturn(0);
44869ce434fSBarry Smith }
44969ce434fSBarry Smith 
450c3002683SMatthew G. Knepley /*@
45169ce434fSBarry Smith   PetscLayoutGetSize - Gets the global size for a PetscLayout object.
45269ce434fSBarry Smith 
45369ce434fSBarry Smith   Not Collective
45469ce434fSBarry Smith 
45569ce434fSBarry Smith   Input Parameters:
45669ce434fSBarry Smith . map - pointer to the map
45769ce434fSBarry Smith 
45869ce434fSBarry Smith   Output Parameters:
45969ce434fSBarry Smith . n - the global size
46069ce434fSBarry Smith 
46169ce434fSBarry Smith   Level: developer
46269ce434fSBarry Smith 
46369ce434fSBarry Smith   Notes:
46469ce434fSBarry Smith   Call this after the call to PetscLayoutSetUp()
46569ce434fSBarry Smith 
466db781477SPatrick Sanan .seealso: `PetscLayoutCreate()`, `PetscLayoutSetLocalSize()`, `PetscLayoutGetLocalSize()`, `PetscLayoutSetSize()`, `PetscLayoutSetUp()`
467db781477SPatrick Sanan           `PetscLayoutGetRange()`, `PetscLayoutGetRanges()`, `PetscLayoutSetBlockSize()`, `PetscLayoutGetBlockSize()`
46869ce434fSBarry Smith @*/
46969ce434fSBarry Smith PetscErrorCode PetscLayoutGetSize(PetscLayout map,PetscInt *n)
47069ce434fSBarry Smith {
47169ce434fSBarry Smith   PetscFunctionBegin;
47269ce434fSBarry Smith   *n = map->N;
47369ce434fSBarry Smith   PetscFunctionReturn(0);
47469ce434fSBarry Smith }
47569ce434fSBarry Smith 
476c3002683SMatthew G. Knepley /*@
47769ce434fSBarry Smith   PetscLayoutSetBlockSize - Sets the block size for a PetscLayout object.
47869ce434fSBarry Smith 
47969ce434fSBarry Smith   Logically Collective on PetscLayout
48069ce434fSBarry Smith 
48169ce434fSBarry Smith   Input Parameters:
48269ce434fSBarry Smith + map - pointer to the map
48369ce434fSBarry Smith - bs - the size
48469ce434fSBarry Smith 
48569ce434fSBarry Smith   Level: developer
48669ce434fSBarry Smith 
48769ce434fSBarry Smith   Notes:
48869ce434fSBarry Smith   Call this after the call to PetscLayoutCreate()
48969ce434fSBarry Smith 
490db781477SPatrick Sanan .seealso: `PetscLayoutCreate()`, `PetscLayoutSetLocalSize()`, `PetscLayoutGetLocalSize()`, `PetscLayoutGetBlockSize()`,
491db781477SPatrick Sanan           `PetscLayoutGetRange()`, `PetscLayoutGetRanges()`, `PetscLayoutSetSize()`, `PetscLayoutGetSize()`, `PetscLayoutSetUp()`
49269ce434fSBarry Smith @*/
49369ce434fSBarry Smith PetscErrorCode PetscLayoutSetBlockSize(PetscLayout map,PetscInt bs)
49469ce434fSBarry Smith {
49569ce434fSBarry Smith   PetscFunctionBegin;
49669bbac97SJed Brown   if (bs < 0) PetscFunctionReturn(0);
497c9cc58a2SBarry Smith   PetscCheck(map->n <= 0 || (map->n % bs) == 0,PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"Local size %" PetscInt_FMT " not compatible with block size %" PetscInt_FMT,map->n,bs);
498565245c5SBarry Smith   if (map->mapping) {
499705e6b8bSstefano_zampini     PetscInt       obs;
500565245c5SBarry Smith 
5019566063dSJacob Faibussowitsch     PetscCall(ISLocalToGlobalMappingGetBlockSize(map->mapping,&obs));
502705e6b8bSstefano_zampini     if (obs > 1) {
5039566063dSJacob Faibussowitsch       PetscCall(ISLocalToGlobalMappingSetBlockSize(map->mapping,bs));
504565245c5SBarry Smith     }
505705e6b8bSstefano_zampini   }
50669ce434fSBarry Smith   map->bs = bs;
50769ce434fSBarry Smith   PetscFunctionReturn(0);
50869ce434fSBarry Smith }
50969ce434fSBarry Smith 
510c3002683SMatthew G. Knepley /*@
51169ce434fSBarry Smith   PetscLayoutGetBlockSize - Gets the block size for a PetscLayout object.
51269ce434fSBarry Smith 
51369ce434fSBarry Smith   Not Collective
51469ce434fSBarry Smith 
51569ce434fSBarry Smith   Input Parameters:
51669ce434fSBarry Smith . map - pointer to the map
51769ce434fSBarry Smith 
51869ce434fSBarry Smith   Output Parameters:
51969ce434fSBarry Smith . bs - the size
52069ce434fSBarry Smith 
52169ce434fSBarry Smith   Level: developer
52269ce434fSBarry Smith 
52369ce434fSBarry Smith   Notes:
52469ce434fSBarry Smith   Call this after the call to PetscLayoutSetUp()
52569ce434fSBarry Smith 
526db781477SPatrick Sanan .seealso: `PetscLayoutCreate()`, `PetscLayoutSetLocalSize()`, `PetscLayoutGetLocalSize()`, `PetscLayoutSetSize()`, `PetscLayoutSetUp()`
527db781477SPatrick Sanan           `PetscLayoutGetRange()`, `PetscLayoutGetRanges()`, `PetscLayoutSetBlockSize()`, `PetscLayoutGetSize()`
52869ce434fSBarry Smith @*/
52969ce434fSBarry Smith PetscErrorCode PetscLayoutGetBlockSize(PetscLayout map,PetscInt *bs)
53069ce434fSBarry Smith {
53169ce434fSBarry Smith   PetscFunctionBegin;
53233d57670SJed Brown   *bs = PetscAbs(map->bs);
53369ce434fSBarry Smith   PetscFunctionReturn(0);
53469ce434fSBarry Smith }
53569ce434fSBarry Smith 
536c3002683SMatthew G. Knepley /*@
53769ce434fSBarry Smith   PetscLayoutGetRange - gets the range of values owned by this process
53869ce434fSBarry Smith 
53969ce434fSBarry Smith   Not Collective
54069ce434fSBarry Smith 
541f899ff85SJose E. Roman   Input Parameter:
54269ce434fSBarry Smith . map - pointer to the map
54369ce434fSBarry Smith 
54469ce434fSBarry Smith   Output Parameters:
54569ce434fSBarry Smith + rstart - first index owned by this process
54669ce434fSBarry Smith - rend   - one more than the last index owned by this process
54769ce434fSBarry Smith 
54869ce434fSBarry Smith   Level: developer
54969ce434fSBarry Smith 
55069ce434fSBarry Smith   Notes:
55169ce434fSBarry Smith   Call this after the call to PetscLayoutSetUp()
55269ce434fSBarry Smith 
553db781477SPatrick Sanan .seealso: `PetscLayoutCreate()`, `PetscLayoutSetLocalSize()`, `PetscLayoutGetLocalSize()`, `PetscLayoutSetSize()`,
554db781477SPatrick Sanan           `PetscLayoutGetSize()`, `PetscLayoutGetRanges()`, `PetscLayoutSetBlockSize()`, `PetscLayoutGetSize()`, `PetscLayoutSetUp()`
55569ce434fSBarry Smith @*/
55669ce434fSBarry Smith PetscErrorCode PetscLayoutGetRange(PetscLayout map,PetscInt *rstart,PetscInt *rend)
55769ce434fSBarry Smith {
55869ce434fSBarry Smith   PetscFunctionBegin;
55969ce434fSBarry Smith   if (rstart) *rstart = map->rstart;
56069ce434fSBarry Smith   if (rend)   *rend   = map->rend;
56169ce434fSBarry Smith   PetscFunctionReturn(0);
56269ce434fSBarry Smith }
56369ce434fSBarry Smith 
56469ce434fSBarry Smith /*@C
56569ce434fSBarry Smith      PetscLayoutGetRanges - gets the range of values owned by all processes
56669ce434fSBarry Smith 
56769ce434fSBarry Smith     Not Collective
56869ce434fSBarry Smith 
56969ce434fSBarry Smith    Input Parameters:
57069ce434fSBarry Smith .    map - pointer to the map
57169ce434fSBarry Smith 
57269ce434fSBarry Smith    Output Parameters:
57369ce434fSBarry Smith .    range - start of each processors range of indices (the final entry is one more then the
57469ce434fSBarry Smith              last index on the last process)
57569ce434fSBarry Smith 
57669ce434fSBarry Smith    Level: developer
57769ce434fSBarry Smith 
57869ce434fSBarry Smith     Notes:
57969ce434fSBarry Smith        Call this after the call to PetscLayoutSetUp()
58069ce434fSBarry Smith 
58169ce434fSBarry Smith     Fortran Notes:
58269ce434fSBarry Smith       Not available from Fortran
58369ce434fSBarry Smith 
584db781477SPatrick Sanan .seealso: `PetscLayoutCreate()`, `PetscLayoutSetLocalSize()`, `PetscLayoutGetLocalSize()`, `PetscLayoutSetSize()`,
585db781477SPatrick Sanan           `PetscLayoutGetSize()`, `PetscLayoutGetRange()`, `PetscLayoutSetBlockSize()`, `PetscLayoutGetSize()`, `PetscLayoutSetUp()`
58669ce434fSBarry Smith 
58769ce434fSBarry Smith @*/
58869ce434fSBarry Smith PetscErrorCode  PetscLayoutGetRanges(PetscLayout map,const PetscInt *range[])
58969ce434fSBarry Smith {
59069ce434fSBarry Smith   PetscFunctionBegin;
59169ce434fSBarry Smith   *range = map->range;
59269ce434fSBarry Smith   PetscFunctionReturn(0);
59369ce434fSBarry Smith }
59469ce434fSBarry Smith 
595f92d6284SStefano Zampini /*@
596f92d6284SStefano Zampini   PetscLayoutCompare - Compares two layouts
597f92d6284SStefano Zampini 
598f92d6284SStefano Zampini   Not Collective
599f92d6284SStefano Zampini 
600f92d6284SStefano Zampini   Input Parameters:
601d11c674dSStefano Zampini + mapa - pointer to the first map
602f92d6284SStefano Zampini - mapb - pointer to the second map
603f92d6284SStefano Zampini 
604f92d6284SStefano Zampini   Output Parameters:
605f92d6284SStefano Zampini . congruent - PETSC_TRUE if the two layouts are congruent, PETSC_FALSE otherwise
606f92d6284SStefano Zampini 
607f92d6284SStefano Zampini   Level: beginner
608f92d6284SStefano Zampini 
609f92d6284SStefano Zampini   Notes:
610f92d6284SStefano Zampini 
611db781477SPatrick Sanan .seealso: `PetscLayoutCreate()`, `PetscLayoutSetLocalSize()`, `PetscLayoutGetLocalSize()`, `PetscLayoutGetBlockSize()`,
612db781477SPatrick Sanan           `PetscLayoutGetRange()`, `PetscLayoutGetRanges()`, `PetscLayoutSetSize()`, `PetscLayoutGetSize()`, `PetscLayoutSetUp()`
613f92d6284SStefano Zampini @*/
614f92d6284SStefano Zampini PetscErrorCode PetscLayoutCompare(PetscLayout mapa,PetscLayout mapb,PetscBool *congruent)
615f92d6284SStefano Zampini {
616f92d6284SStefano Zampini   PetscFunctionBegin;
617f92d6284SStefano Zampini   *congruent = PETSC_FALSE;
61838a25198SStefano Zampini   if (mapa->N == mapb->N && mapa->range && mapb->range && mapa->size == mapb->size) {
6199566063dSJacob Faibussowitsch     PetscCall(PetscArraycmp(mapa->range,mapb->range,mapa->size+1,congruent));
620f92d6284SStefano Zampini   }
621f92d6284SStefano Zampini   PetscFunctionReturn(0);
622f92d6284SStefano Zampini }
623