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 4669ce434fSBarry Smith .seealso: PetscLayoutSetLocalSize(), PetscLayoutSetSize(), PetscLayoutGetSize(), PetscLayoutGetLocalSize(), PetscLayout, PetscLayoutDestroy(), 479621ec18SVaclav Hapla PetscLayoutGetRange(), PetscLayoutGetRanges(), PetscLayoutSetBlockSize(), PetscLayoutGetBlockSize(), PetscLayoutSetUp(), 489621ec18SVaclav Hapla 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 989621ec18SVaclav Hapla .seealso: PetscLayoutCreate(), PetscLayoutSetLocalSize(), PetscLayoutSetSize(), PetscLayoutGetSize(), PetscLayoutGetLocalSize(), PetscLayout, PetscLayoutDestroy(), 999621ec18SVaclav Hapla 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 12769ce434fSBarry Smith .seealso: PetscLayoutSetLocalSize(), PetscLayoutSetSize(), PetscLayoutGetSize(), PetscLayoutGetLocalSize(), PetscLayout, PetscLayoutCreate(), 12869ce434fSBarry Smith 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 1609621ec18SVaclav Hapla .seealso: PetscLayoutCreate(), PetscLayoutSetLocalSize(), PetscLayoutSetSize(), PetscLayoutGetSize(), PetscLayoutGetLocalSize(), PetscLayout, PetscLayoutDestroy(), 1619621ec18SVaclav Hapla 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)); 1912c71b3e2SJacob Faibussowitsch PetscCheckFalse(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) { 1932c71b3e2SJacob Faibussowitsch PetscCheckFalse(map->n % map->bs,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) { 1962c71b3e2SJacob Faibussowitsch PetscCheckFalse(map->N % map->bs,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 23169ce434fSBarry Smith .seealso: PetscLayoutSetLocalSize(), PetscLayoutSetSize(), PetscLayoutGetSize(), PetscLayoutGetLocalSize(), PetscLayout, PetscLayoutDestroy(), 23269ce434fSBarry Smith 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; 2402c71b3e2SJacob Faibussowitsch PetscCheckFalse(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) { 2442c71b3e2SJacob Faibussowitsch PetscCheckFalse(map->n % map->bs,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) { 2472c71b3e2SJacob Faibussowitsch PetscCheckFalse(map->N % map->bs,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 29169ce434fSBarry Smith .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 32769ce434fSBarry Smith .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 354a188d78dSBarry Smith .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)); 3632c71b3e2SJacob Faibussowitsch PetscCheckFalse(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 38569ce434fSBarry Smith .seealso: PetscLayoutCreate(), PetscLayoutSetSize(), PetscLayoutGetSize(), PetscLayoutGetLocalSize(), PetscLayoutSetUp() 38669ce434fSBarry Smith PetscLayoutGetRange(), PetscLayoutGetRanges(), PetscLayoutSetBlockSize(), PetscLayoutGetBlockSize() 38769ce434fSBarry Smith @*/ 38869ce434fSBarry Smith PetscErrorCode PetscLayoutSetLocalSize(PetscLayout map,PetscInt n) 38969ce434fSBarry Smith { 39069ce434fSBarry Smith PetscFunctionBegin; 3912c71b3e2SJacob Faibussowitsch PetscCheckFalse(map->bs > 1 && n % map->bs,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 39669ce434fSBarry Smith /*@C 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 41569ce434fSBarry Smith .seealso: PetscLayoutCreate(), PetscLayoutSetSize(), PetscLayoutGetSize(), PetscLayoutGetLocalSize(), PetscLayoutSetUp() 41669ce434fSBarry Smith 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 44069ce434fSBarry Smith .seealso: PetscLayoutCreate(), PetscLayoutSetLocalSize(), PetscLayoutGetLocalSize(), PetscLayoutGetSize(), PetscLayoutSetUp() 44169ce434fSBarry Smith 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 46669ce434fSBarry Smith .seealso: PetscLayoutCreate(), PetscLayoutSetLocalSize(), PetscLayoutGetLocalSize(), PetscLayoutSetSize(), PetscLayoutSetUp() 46769ce434fSBarry Smith 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 49069ce434fSBarry Smith .seealso: PetscLayoutCreate(), PetscLayoutSetLocalSize(), PetscLayoutGetLocalSize(), PetscLayoutGetBlockSize(), 49169ce434fSBarry Smith 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); 4972c71b3e2SJacob Faibussowitsch PetscCheckFalse(map->n > 0 && map->n % bs,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 52669ce434fSBarry Smith .seealso: PetscLayoutCreate(), PetscLayoutSetLocalSize(), PetscLayoutGetLocalSize(), PetscLayoutSetSize(), PetscLayoutSetUp() 52769ce434fSBarry Smith 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 55369ce434fSBarry Smith .seealso: PetscLayoutCreate(), PetscLayoutSetLocalSize(), PetscLayoutGetLocalSize(), PetscLayoutSetSize(), 55469ce434fSBarry Smith 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: 573*c3b5f7baSPierre Jolivet . range - start of each processors range of indices (the final entry is one more than 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 58469ce434fSBarry Smith .seealso: PetscLayoutCreate(), PetscLayoutSetLocalSize(), PetscLayoutGetLocalSize(), PetscLayoutSetSize(), 58569ce434fSBarry Smith 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 611f92d6284SStefano Zampini .seealso: PetscLayoutCreate(), PetscLayoutSetLocalSize(), PetscLayoutGetLocalSize(), PetscLayoutGetBlockSize(), 612f92d6284SStefano Zampini 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