169ce434fSBarry Smith 269ce434fSBarry Smith /* 369ce434fSBarry Smith This file contains routines for basic map object implementation. 469ce434fSBarry Smith */ 569ce434fSBarry Smith 669ce434fSBarry Smith #include <petscvec.h> 70c312b8eSJed Brown #include <petscsf.h> 869ce434fSBarry Smith #include <petsc-private/threadcommimpl.h> 969ce434fSBarry Smith #undef __FUNCT__ 1069ce434fSBarry Smith #define __FUNCT__ "PetscLayoutCreate" 1169ce434fSBarry Smith /*@C 1269ce434fSBarry Smith PetscLayoutCreate - Allocates PetscLayout space and sets the map contents to the default. 1369ce434fSBarry Smith 1469ce434fSBarry Smith Collective on MPI_Comm 1569ce434fSBarry Smith 1669ce434fSBarry Smith Input Parameters: 1769ce434fSBarry Smith + comm - the MPI communicator 1869ce434fSBarry Smith - map - pointer to the map 1969ce434fSBarry Smith 20456fcb79SJed Brown Level: advanced 2169ce434fSBarry Smith 22456fcb79SJed Brown Notes: 23456fcb79SJed Brown Typical calling sequence 24456fcb79SJed Brown .vb 2569ce434fSBarry Smith PetscLayoutCreate(MPI_Comm,PetscLayout *); 2669ce434fSBarry Smith PetscLayoutSetBlockSize(PetscLayout,1); 27456fcb79SJed Brown PetscLayoutSetSize(PetscLayout,N) // or PetscLayoutSetLocalSize(PetscLayout,n); 2869ce434fSBarry Smith PetscLayoutSetUp(PetscLayout); 29456fcb79SJed Brown .ve 3069ce434fSBarry Smith Optionally use any of the following: 31456fcb79SJed Brown 32456fcb79SJed Brown + PetscLayoutGetSize(PetscLayout,PetscInt *); 33456fcb79SJed Brown . PetscLayoutGetLocalSize(PetscLayout,PetscInt *); 34456fcb79SJed Brown . PetscLayoutGetRange(PetscLayout,PetscInt *rstart,PetscInt *rend); 35456fcb79SJed Brown . PetscLayoutGetRanges(PetscLayout,const PetscInt *range[]); 36456fcb79SJed Brown - PetscLayoutDestroy(PetscLayout*); 3769ce434fSBarry Smith 3869ce434fSBarry Smith The PetscLayout object and methods are intended to be used in the PETSc Vec and Mat implementions; it is often not needed in 3969ce434fSBarry Smith user codes unless you really gain something in their use. 4069ce434fSBarry Smith 4169ce434fSBarry Smith Fortran Notes: 4269ce434fSBarry Smith Not available from Fortran 4369ce434fSBarry Smith 4469ce434fSBarry Smith .seealso: PetscLayoutSetLocalSize(), PetscLayoutSetSize(), PetscLayoutGetSize(), PetscLayoutGetLocalSize(), PetscLayout, PetscLayoutDestroy(), 4569ce434fSBarry Smith PetscLayoutGetRange(), PetscLayoutGetRanges(), PetscLayoutSetBlockSize(), PetscLayoutGetBlockSize(), PetscLayoutSetUp() 4669ce434fSBarry Smith 4769ce434fSBarry Smith @*/ 4869ce434fSBarry Smith PetscErrorCode PetscLayoutCreate(MPI_Comm comm,PetscLayout *map) 4969ce434fSBarry Smith { 5069ce434fSBarry Smith PetscErrorCode ierr; 5169ce434fSBarry Smith 5269ce434fSBarry Smith PetscFunctionBegin; 53*b00a9115SJed Brown ierr = PetscNew(map);CHKERRQ(ierr); 5469ce434fSBarry Smith 5569ce434fSBarry Smith (*map)->comm = comm; 5669ce434fSBarry Smith (*map)->bs = -1; 5769ce434fSBarry Smith (*map)->n = -1; 5869ce434fSBarry Smith (*map)->N = -1; 5969ce434fSBarry Smith (*map)->range = 0; 6069ce434fSBarry Smith (*map)->rstart = 0; 6169ce434fSBarry Smith (*map)->rend = 0; 6269ce434fSBarry Smith (*map)->trstarts = 0; 6369ce434fSBarry Smith PetscFunctionReturn(0); 6469ce434fSBarry Smith } 6569ce434fSBarry Smith 6669ce434fSBarry Smith /*@C 6769ce434fSBarry Smith PetscLayoutDestroy - Frees a map object and frees its range if that exists. 6869ce434fSBarry Smith 6969ce434fSBarry Smith Collective on MPI_Comm 7069ce434fSBarry Smith 7169ce434fSBarry Smith Input Parameters: 7269ce434fSBarry Smith . map - the PetscLayout 7369ce434fSBarry Smith 7469ce434fSBarry Smith Level: developer 7569ce434fSBarry Smith 7669ce434fSBarry Smith The PetscLayout object and methods are intended to be used in the PETSc Vec and Mat implementions; it is 7769ce434fSBarry Smith recommended they not be used in user codes unless you really gain something in their use. 7869ce434fSBarry Smith 7969ce434fSBarry Smith Fortran Notes: 8069ce434fSBarry Smith Not available from Fortran 8169ce434fSBarry Smith 8269ce434fSBarry Smith .seealso: PetscLayoutSetLocalSize(), PetscLayoutSetSize(), PetscLayoutGetSize(), PetscLayoutGetLocalSize(), PetscLayout, PetscLayoutCreate(), 8369ce434fSBarry Smith PetscLayoutGetRange(), PetscLayoutGetRanges(), PetscLayoutSetBlockSize(), PetscLayoutGetBlockSize(), PetscLayoutSetUp() 8469ce434fSBarry Smith 8569ce434fSBarry Smith @*/ 8669ce434fSBarry Smith #undef __FUNCT__ 8769ce434fSBarry Smith #define __FUNCT__ "PetscLayoutDestroy" 8869ce434fSBarry Smith PetscErrorCode PetscLayoutDestroy(PetscLayout *map) 8969ce434fSBarry Smith { 9069ce434fSBarry Smith PetscErrorCode ierr; 9169ce434fSBarry Smith 9269ce434fSBarry Smith PetscFunctionBegin; 9369ce434fSBarry Smith if (!*map) PetscFunctionReturn(0); 9469ce434fSBarry Smith if (!(*map)->refcnt--) { 9569ce434fSBarry Smith ierr = PetscFree((*map)->range);CHKERRQ(ierr); 9669ce434fSBarry Smith ierr = ISLocalToGlobalMappingDestroy(&(*map)->mapping);CHKERRQ(ierr); 9769ce434fSBarry Smith ierr = ISLocalToGlobalMappingDestroy(&(*map)->bmapping);CHKERRQ(ierr); 9869ce434fSBarry Smith #if defined(PETSC_THREADCOMM_ACTIVE) 9969ce434fSBarry Smith ierr = PetscFree((*map)->trstarts);CHKERRQ(ierr); 10069ce434fSBarry Smith #endif 10169ce434fSBarry Smith 10269ce434fSBarry Smith ierr = PetscFree((*map));CHKERRQ(ierr); 10369ce434fSBarry Smith } 10469ce434fSBarry Smith *map = NULL; 10569ce434fSBarry Smith PetscFunctionReturn(0); 10669ce434fSBarry Smith } 10769ce434fSBarry Smith 10869ce434fSBarry Smith /*@C 10969ce434fSBarry Smith PetscLayoutSetUp - given a map where you have set either the global or local 11069ce434fSBarry Smith size sets up the map so that it may be used. 11169ce434fSBarry Smith 11269ce434fSBarry Smith Collective on MPI_Comm 11369ce434fSBarry Smith 11469ce434fSBarry Smith Input Parameters: 11569ce434fSBarry Smith . map - pointer to the map 11669ce434fSBarry Smith 11769ce434fSBarry Smith Level: developer 11869ce434fSBarry Smith 11969ce434fSBarry Smith Notes: Typical calling sequence 12069ce434fSBarry Smith PetscLayoutCreate(MPI_Comm,PetscLayout *); 12169ce434fSBarry Smith PetscLayoutSetBlockSize(PetscLayout,1); 12269ce434fSBarry Smith PetscLayoutSetSize(PetscLayout,n) or PetscLayoutSetLocalSize(PetscLayout,N); or both 12369ce434fSBarry Smith PetscLayoutSetUp(PetscLayout); 12469ce434fSBarry Smith PetscLayoutGetSize(PetscLayout,PetscInt *); 12569ce434fSBarry Smith 12669ce434fSBarry Smith 12769ce434fSBarry Smith If the local size, global size are already set and range exists then this does nothing. 12869ce434fSBarry Smith 12969ce434fSBarry Smith Fortran Notes: 13069ce434fSBarry Smith Not available from Fortran 13169ce434fSBarry Smith 13269ce434fSBarry Smith .seealso: PetscLayoutSetLocalSize(), PetscLayoutSetSize(), PetscLayoutGetSize(), PetscLayoutGetLocalSize(), PetscLayout, PetscLayoutDestroy(), 13369ce434fSBarry Smith PetscLayoutGetRange(), PetscLayoutGetRanges(), PetscLayoutSetBlockSize(), PetscLayoutGetBlockSize(), PetscLayoutCreate() 13469ce434fSBarry Smith 13569ce434fSBarry Smith @*/ 13669ce434fSBarry Smith #undef __FUNCT__ 13769ce434fSBarry Smith #define __FUNCT__ "PetscLayoutSetUp" 13869ce434fSBarry Smith PetscErrorCode PetscLayoutSetUp(PetscLayout map) 13969ce434fSBarry Smith { 14069ce434fSBarry Smith PetscMPIInt rank,size; 14169ce434fSBarry Smith PetscInt p; 14269ce434fSBarry Smith PetscErrorCode ierr; 14369ce434fSBarry Smith 14469ce434fSBarry Smith PetscFunctionBegin; 14569ce434fSBarry Smith if (map->bs <= 0) map->bs = 1; 14669ce434fSBarry Smith if ((map->n >= 0) && (map->N >= 0) && (map->range)) PetscFunctionReturn(0); 14769ce434fSBarry Smith 14869ce434fSBarry Smith ierr = MPI_Comm_size(map->comm, &size);CHKERRQ(ierr); 14969ce434fSBarry Smith ierr = MPI_Comm_rank(map->comm, &rank);CHKERRQ(ierr); 15069ce434fSBarry Smith if (map->n > 0) map->n = map->n/map->bs; 15169ce434fSBarry Smith if (map->N > 0) map->N = map->N/map->bs; 15269ce434fSBarry Smith ierr = PetscSplitOwnership(map->comm,&map->n,&map->N);CHKERRQ(ierr); 15369ce434fSBarry Smith map->n = map->n*map->bs; 15469ce434fSBarry Smith map->N = map->N*map->bs; 15569ce434fSBarry Smith if (!map->range) { 156785e854fSJed Brown ierr = PetscMalloc1((size+1), &map->range);CHKERRQ(ierr); 15769ce434fSBarry Smith } 15869ce434fSBarry Smith ierr = MPI_Allgather(&map->n, 1, MPIU_INT, map->range+1, 1, MPIU_INT, map->comm);CHKERRQ(ierr); 15969ce434fSBarry Smith 16069ce434fSBarry Smith map->range[0] = 0; 16169ce434fSBarry Smith for (p = 2; p <= size; p++) map->range[p] += map->range[p-1]; 16269ce434fSBarry Smith 16369ce434fSBarry Smith map->rstart = map->range[rank]; 16469ce434fSBarry Smith map->rend = map->range[rank+1]; 16569ce434fSBarry Smith #if defined(PETSC_THREADCOMM_ACTIVE) 16669ce434fSBarry Smith /* Set the thread ownership ranges */ 16769ce434fSBarry Smith ierr = PetscThreadCommGetOwnershipRanges(map->comm,map->n,&map->trstarts);CHKERRQ(ierr); 16869ce434fSBarry Smith #endif 16969ce434fSBarry Smith PetscFunctionReturn(0); 17069ce434fSBarry Smith } 17169ce434fSBarry Smith 17269ce434fSBarry Smith #undef __FUNCT__ 17369ce434fSBarry Smith #define __FUNCT__ "PetscLayoutDuplicate" 17469ce434fSBarry Smith /*@C 17569ce434fSBarry Smith 17669ce434fSBarry Smith PetscLayoutDuplicate - creates a new PetscLayout with the same information as a given one. If the PetscLayout already exists it is destroyed first. 17769ce434fSBarry Smith 17869ce434fSBarry Smith Collective on PetscLayout 17969ce434fSBarry Smith 18069ce434fSBarry Smith Input Parameter: 18169ce434fSBarry Smith . in - input PetscLayout to be duplicated 18269ce434fSBarry Smith 18369ce434fSBarry Smith Output Parameter: 18469ce434fSBarry Smith . out - the copy 18569ce434fSBarry Smith 18669ce434fSBarry Smith Level: developer 18769ce434fSBarry Smith 18869ce434fSBarry Smith Notes: PetscLayoutSetUp() does not need to be called on the resulting PetscLayout 18969ce434fSBarry Smith 19069ce434fSBarry Smith .seealso: PetscLayoutCreate(), PetscLayoutDestroy(), PetscLayoutSetUp(), PetscLayoutReference() 19169ce434fSBarry Smith 19269ce434fSBarry Smith @*/ 19369ce434fSBarry Smith PetscErrorCode PetscLayoutDuplicate(PetscLayout in,PetscLayout *out) 19469ce434fSBarry Smith { 19569ce434fSBarry Smith PetscMPIInt size; 19669ce434fSBarry Smith PetscErrorCode ierr; 19769ce434fSBarry Smith MPI_Comm comm = in->comm; 19869ce434fSBarry Smith 19969ce434fSBarry Smith PetscFunctionBegin; 20069ce434fSBarry Smith ierr = PetscLayoutDestroy(out);CHKERRQ(ierr); 20169ce434fSBarry Smith ierr = PetscLayoutCreate(comm,out);CHKERRQ(ierr); 20269ce434fSBarry Smith ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 20369ce434fSBarry Smith ierr = PetscMemcpy(*out,in,sizeof(struct _n_PetscLayout));CHKERRQ(ierr); 204785e854fSJed Brown ierr = PetscMalloc1((size+1),&(*out)->range);CHKERRQ(ierr); 20569ce434fSBarry Smith ierr = PetscMemcpy((*out)->range,in->range,(size+1)*sizeof(PetscInt));CHKERRQ(ierr); 20669ce434fSBarry Smith 20769ce434fSBarry Smith (*out)->refcnt = 0; 20869ce434fSBarry Smith PetscFunctionReturn(0); 20969ce434fSBarry Smith } 21069ce434fSBarry Smith 21169ce434fSBarry Smith #undef __FUNCT__ 21269ce434fSBarry Smith #define __FUNCT__ "PetscLayoutReference" 21369ce434fSBarry Smith /*@C 21469ce434fSBarry Smith 21569ce434fSBarry Smith PetscLayoutReference - Causes a PETSc Vec or Mat to share a PetscLayout with one that already exists. Used by Vec/MatDuplicate_XXX() 21669ce434fSBarry Smith 21769ce434fSBarry Smith Collective on PetscLayout 21869ce434fSBarry Smith 21969ce434fSBarry Smith Input Parameter: 22069ce434fSBarry Smith . in - input PetscLayout to be copied 22169ce434fSBarry Smith 22269ce434fSBarry Smith Output Parameter: 22369ce434fSBarry Smith . out - the reference location 22469ce434fSBarry Smith 22569ce434fSBarry Smith Level: developer 22669ce434fSBarry Smith 22769ce434fSBarry Smith Notes: PetscLayoutSetUp() does not need to be called on the resulting PetscLayout 22869ce434fSBarry Smith 22969ce434fSBarry Smith If the out location already contains a PetscLayout it is destroyed 23069ce434fSBarry Smith 23169ce434fSBarry Smith .seealso: PetscLayoutCreate(), PetscLayoutDestroy(), PetscLayoutSetUp(), PetscLayoutDuplicate() 23269ce434fSBarry Smith 23369ce434fSBarry Smith @*/ 23469ce434fSBarry Smith PetscErrorCode PetscLayoutReference(PetscLayout in,PetscLayout *out) 23569ce434fSBarry Smith { 23669ce434fSBarry Smith PetscErrorCode ierr; 23769ce434fSBarry Smith 23869ce434fSBarry Smith PetscFunctionBegin; 23969ce434fSBarry Smith in->refcnt++; 24069ce434fSBarry Smith ierr = PetscLayoutDestroy(out);CHKERRQ(ierr); 24169ce434fSBarry Smith *out = in; 24269ce434fSBarry Smith PetscFunctionReturn(0); 24369ce434fSBarry Smith } 24469ce434fSBarry Smith 24569ce434fSBarry Smith #undef __FUNCT__ 24669ce434fSBarry Smith #define __FUNCT__ "PetscLayoutSetISLocalToGlobalMapping" 24769ce434fSBarry Smith /*@C 24869ce434fSBarry Smith 24969ce434fSBarry Smith PetscLayoutSetISLocalToGlobalMapping - sets a ISLocalGlobalMapping into a PetscLayout 25069ce434fSBarry Smith 25169ce434fSBarry Smith Collective on PetscLayout 25269ce434fSBarry Smith 25369ce434fSBarry Smith Input Parameter: 25469ce434fSBarry Smith + in - input PetscLayout 25569ce434fSBarry Smith - ltog - the local to global mapping 25669ce434fSBarry Smith 25769ce434fSBarry Smith 25869ce434fSBarry Smith Level: developer 25969ce434fSBarry Smith 26069ce434fSBarry Smith Notes: PetscLayoutSetUp() does not need to be called on the resulting PetscLayout 26169ce434fSBarry Smith 26269ce434fSBarry Smith If the ltog location already contains a PetscLayout it is destroyed 26369ce434fSBarry Smith 26469ce434fSBarry Smith .seealso: PetscLayoutCreate(), PetscLayoutDestroy(), PetscLayoutSetUp(), PetscLayoutDuplicate(), PetscLayoutSetLocalToGlobalMappingBlock() 26569ce434fSBarry Smith 26669ce434fSBarry Smith @*/ 26769ce434fSBarry Smith PetscErrorCode PetscLayoutSetISLocalToGlobalMapping(PetscLayout in,ISLocalToGlobalMapping ltog) 26869ce434fSBarry Smith { 26969ce434fSBarry Smith PetscErrorCode ierr; 27069ce434fSBarry Smith 27169ce434fSBarry Smith PetscFunctionBegin; 27269ce434fSBarry Smith ierr = PetscObjectReference((PetscObject)ltog);CHKERRQ(ierr); 27369ce434fSBarry Smith ierr = ISLocalToGlobalMappingDestroy(&in->mapping);CHKERRQ(ierr); 27469ce434fSBarry Smith 27569ce434fSBarry Smith in->mapping = ltog; 27669ce434fSBarry Smith PetscFunctionReturn(0); 27769ce434fSBarry Smith } 27869ce434fSBarry Smith 27969ce434fSBarry Smith #undef __FUNCT__ 28069ce434fSBarry Smith #define __FUNCT__ "PetscLayoutSetISLocalToGlobalMappingBlock" 28169ce434fSBarry Smith /*@C 28269ce434fSBarry Smith 28369ce434fSBarry Smith PetscLayoutSetISLocalToGlobalMappingBlock - sets a ISLocalGlobalMapping into a PetscLayout 28469ce434fSBarry Smith 28569ce434fSBarry Smith Collective on PetscLayout 28669ce434fSBarry Smith 28769ce434fSBarry Smith Input Parameter: 28869ce434fSBarry Smith + in - input PetscLayout 28969ce434fSBarry Smith - ltog - the local to global block mapping 29069ce434fSBarry Smith 29169ce434fSBarry Smith 29269ce434fSBarry Smith Level: developer 29369ce434fSBarry Smith 29469ce434fSBarry Smith Notes: PetscLayoutSetUp() does not need to be called on the resulting PetscLayout 29569ce434fSBarry Smith 29669ce434fSBarry Smith If the ltog location already contains a PetscLayout it is destroyed 29769ce434fSBarry Smith 29869ce434fSBarry Smith .seealso: PetscLayoutCreate(), PetscLayoutDestroy(), PetscLayoutSetUp(), PetscLayoutDuplicate(), PetscLayoutSetLocalToGlobalMappingBlock() 29969ce434fSBarry Smith 30069ce434fSBarry Smith @*/ 30169ce434fSBarry Smith PetscErrorCode PetscLayoutSetISLocalToGlobalMappingBlock(PetscLayout in,ISLocalToGlobalMapping ltog) 30269ce434fSBarry Smith { 30369ce434fSBarry Smith PetscErrorCode ierr; 30469ce434fSBarry Smith 30569ce434fSBarry Smith PetscFunctionBegin; 30669ce434fSBarry Smith ierr = PetscObjectReference((PetscObject)ltog);CHKERRQ(ierr); 30769ce434fSBarry Smith ierr = ISLocalToGlobalMappingDestroy(&in->bmapping);CHKERRQ(ierr); 30869ce434fSBarry Smith 30969ce434fSBarry Smith in->bmapping = ltog; 31069ce434fSBarry Smith PetscFunctionReturn(0); 31169ce434fSBarry Smith } 31269ce434fSBarry Smith 31369ce434fSBarry Smith /*@C 31469ce434fSBarry Smith PetscLayoutSetLocalSize - Sets the local size for a PetscLayout object. 31569ce434fSBarry Smith 31669ce434fSBarry Smith Collective on PetscLayout 31769ce434fSBarry Smith 31869ce434fSBarry Smith Input Parameters: 31969ce434fSBarry Smith + map - pointer to the map 32069ce434fSBarry Smith - n - the local size 32169ce434fSBarry Smith 32269ce434fSBarry Smith Level: developer 32369ce434fSBarry Smith 32469ce434fSBarry Smith Notes: 32569ce434fSBarry Smith Call this after the call to PetscLayoutCreate() 32669ce434fSBarry Smith 32769ce434fSBarry Smith Fortran Notes: 32869ce434fSBarry Smith Not available from Fortran 32969ce434fSBarry Smith 33069ce434fSBarry Smith .seealso: PetscLayoutCreate(), PetscLayoutSetSize(), PetscLayoutGetSize(), PetscLayoutGetLocalSize(), PetscLayoutSetUp() 33169ce434fSBarry Smith PetscLayoutGetRange(), PetscLayoutGetRanges(), PetscLayoutSetBlockSize(), PetscLayoutGetBlockSize() 33269ce434fSBarry Smith 33369ce434fSBarry Smith @*/ 33469ce434fSBarry Smith #undef __FUNCT__ 33569ce434fSBarry Smith #define __FUNCT__ "PetscLayoutSetLocalSize" 33669ce434fSBarry Smith PetscErrorCode PetscLayoutSetLocalSize(PetscLayout map,PetscInt n) 33769ce434fSBarry Smith { 33869ce434fSBarry Smith PetscFunctionBegin; 33969ce434fSBarry Smith if (map->bs > 1 && n % map->bs) SETERRQ2(map->comm,PETSC_ERR_ARG_INCOMP,"Local size %D not compatible with block size %D",n,map->bs); 34069ce434fSBarry Smith map->n = n; 34169ce434fSBarry Smith PetscFunctionReturn(0); 34269ce434fSBarry Smith } 34369ce434fSBarry Smith 34469ce434fSBarry Smith /*@C 34569ce434fSBarry Smith PetscLayoutGetLocalSize - Gets the local size for a PetscLayout object. 34669ce434fSBarry Smith 34769ce434fSBarry Smith Not Collective 34869ce434fSBarry Smith 34969ce434fSBarry Smith Input Parameters: 35069ce434fSBarry Smith . map - pointer to the map 35169ce434fSBarry Smith 35269ce434fSBarry Smith Output Parameters: 35369ce434fSBarry Smith . n - the local size 35469ce434fSBarry Smith 35569ce434fSBarry Smith Level: developer 35669ce434fSBarry Smith 35769ce434fSBarry Smith Notes: 35869ce434fSBarry Smith Call this after the call to PetscLayoutSetUp() 35969ce434fSBarry Smith 36069ce434fSBarry Smith Fortran Notes: 36169ce434fSBarry Smith Not available from Fortran 36269ce434fSBarry Smith 36369ce434fSBarry Smith .seealso: PetscLayoutCreate(), PetscLayoutSetSize(), PetscLayoutGetSize(), PetscLayoutGetLocalSize(), PetscLayoutSetUp() 36469ce434fSBarry Smith PetscLayoutGetRange(), PetscLayoutGetRanges(), PetscLayoutSetBlockSize(), PetscLayoutGetBlockSize() 36569ce434fSBarry Smith 36669ce434fSBarry Smith @*/ 36769ce434fSBarry Smith #undef __FUNCT__ 36869ce434fSBarry Smith #define __FUNCT__ "PetscLayoutGetLocalSize" 36969ce434fSBarry Smith PetscErrorCode PetscLayoutGetLocalSize(PetscLayout map,PetscInt *n) 37069ce434fSBarry Smith { 37169ce434fSBarry Smith PetscFunctionBegin; 37269ce434fSBarry Smith *n = map->n; 37369ce434fSBarry Smith PetscFunctionReturn(0); 37469ce434fSBarry Smith } 37569ce434fSBarry Smith 37669ce434fSBarry Smith /*@C 37769ce434fSBarry Smith PetscLayoutSetSize - Sets the global size for a PetscLayout object. 37869ce434fSBarry Smith 37969ce434fSBarry Smith Logically Collective on PetscLayout 38069ce434fSBarry Smith 38169ce434fSBarry Smith Input Parameters: 38269ce434fSBarry Smith + map - pointer to the map 38369ce434fSBarry Smith - n - the global size 38469ce434fSBarry Smith 38569ce434fSBarry Smith Level: developer 38669ce434fSBarry Smith 38769ce434fSBarry Smith Notes: 38869ce434fSBarry Smith Call this after the call to PetscLayoutCreate() 38969ce434fSBarry Smith 39069ce434fSBarry Smith Fortran Notes: 39169ce434fSBarry Smith Not available from Fortran 39269ce434fSBarry Smith 39369ce434fSBarry Smith .seealso: PetscLayoutCreate(), PetscLayoutSetLocalSize(), PetscLayoutGetLocalSize(), PetscLayoutGetSize(), PetscLayoutSetUp() 39469ce434fSBarry Smith PetscLayoutGetRange(), PetscLayoutGetRanges(), PetscLayoutSetBlockSize(), PetscLayoutGetBlockSize() 39569ce434fSBarry Smith 39669ce434fSBarry Smith @*/ 39769ce434fSBarry Smith #undef __FUNCT__ 39869ce434fSBarry Smith #define __FUNCT__ "PetscLayoutSetSize" 39969ce434fSBarry Smith PetscErrorCode PetscLayoutSetSize(PetscLayout map,PetscInt n) 40069ce434fSBarry Smith { 40169ce434fSBarry Smith PetscFunctionBegin; 40269ce434fSBarry Smith map->N = n; 40369ce434fSBarry Smith PetscFunctionReturn(0); 40469ce434fSBarry Smith } 40569ce434fSBarry Smith 40669ce434fSBarry Smith /*@C 40769ce434fSBarry Smith PetscLayoutGetSize - Gets the global size for a PetscLayout object. 40869ce434fSBarry Smith 40969ce434fSBarry Smith Not Collective 41069ce434fSBarry Smith 41169ce434fSBarry Smith Input Parameters: 41269ce434fSBarry Smith . map - pointer to the map 41369ce434fSBarry Smith 41469ce434fSBarry Smith Output Parameters: 41569ce434fSBarry Smith . n - the global size 41669ce434fSBarry Smith 41769ce434fSBarry Smith Level: developer 41869ce434fSBarry Smith 41969ce434fSBarry Smith Notes: 42069ce434fSBarry Smith Call this after the call to PetscLayoutSetUp() 42169ce434fSBarry Smith 42269ce434fSBarry Smith Fortran Notes: 42369ce434fSBarry Smith Not available from Fortran 42469ce434fSBarry Smith 42569ce434fSBarry Smith .seealso: PetscLayoutCreate(), PetscLayoutSetLocalSize(), PetscLayoutGetLocalSize(), PetscLayoutSetSize(), PetscLayoutSetUp() 42669ce434fSBarry Smith PetscLayoutGetRange(), PetscLayoutGetRanges(), PetscLayoutSetBlockSize(), PetscLayoutGetBlockSize() 42769ce434fSBarry Smith 42869ce434fSBarry Smith @*/ 42969ce434fSBarry Smith #undef __FUNCT__ 43069ce434fSBarry Smith #define __FUNCT__ "PetscLayoutGetSize" 43169ce434fSBarry Smith PetscErrorCode PetscLayoutGetSize(PetscLayout map,PetscInt *n) 43269ce434fSBarry Smith { 43369ce434fSBarry Smith PetscFunctionBegin; 43469ce434fSBarry Smith *n = map->N; 43569ce434fSBarry Smith PetscFunctionReturn(0); 43669ce434fSBarry Smith } 43769ce434fSBarry Smith 43869ce434fSBarry Smith /*@C 43969ce434fSBarry Smith PetscLayoutSetBlockSize - Sets the block size for a PetscLayout object. 44069ce434fSBarry Smith 44169ce434fSBarry Smith Logically Collective on PetscLayout 44269ce434fSBarry Smith 44369ce434fSBarry Smith Input Parameters: 44469ce434fSBarry Smith + map - pointer to the map 44569ce434fSBarry Smith - bs - the size 44669ce434fSBarry Smith 44769ce434fSBarry Smith Level: developer 44869ce434fSBarry Smith 44969ce434fSBarry Smith Notes: 45069ce434fSBarry Smith Call this after the call to PetscLayoutCreate() 45169ce434fSBarry Smith 45269ce434fSBarry Smith Fortran Notes: 45369ce434fSBarry Smith Not available from Fortran 45469ce434fSBarry Smith 45569ce434fSBarry Smith .seealso: PetscLayoutCreate(), PetscLayoutSetLocalSize(), PetscLayoutGetLocalSize(), PetscLayoutGetBlockSize(), 45669ce434fSBarry Smith PetscLayoutGetRange(), PetscLayoutGetRanges(), PetscLayoutSetSize(), PetscLayoutGetSize(), PetscLayoutSetUp() 45769ce434fSBarry Smith 45869ce434fSBarry Smith @*/ 45969ce434fSBarry Smith #undef __FUNCT__ 46069ce434fSBarry Smith #define __FUNCT__ "PetscLayoutSetBlockSize" 46169ce434fSBarry Smith PetscErrorCode PetscLayoutSetBlockSize(PetscLayout map,PetscInt bs) 46269ce434fSBarry Smith { 46369ce434fSBarry Smith PetscFunctionBegin; 46469ce434fSBarry Smith if (map->n > 0 && map->n % bs) SETERRQ2(map->comm,PETSC_ERR_ARG_INCOMP,"Local size %D not compatible with block size %D",map->n,bs); 46569ce434fSBarry Smith if (map->bs > 0 && map->bs != bs) SETERRQ2(map->comm,PETSC_ERR_ARG_INCOMP,"Cannot change block size %D to %D",map->bs,bs); 46669ce434fSBarry Smith map->bs = bs; 46769ce434fSBarry Smith PetscFunctionReturn(0); 46869ce434fSBarry Smith } 46969ce434fSBarry Smith 47069ce434fSBarry Smith /*@C 47169ce434fSBarry Smith PetscLayoutGetBlockSize - Gets the block size for a PetscLayout object. 47269ce434fSBarry Smith 47369ce434fSBarry Smith Not Collective 47469ce434fSBarry Smith 47569ce434fSBarry Smith Input Parameters: 47669ce434fSBarry Smith . map - pointer to the map 47769ce434fSBarry Smith 47869ce434fSBarry Smith Output Parameters: 47969ce434fSBarry Smith . bs - the size 48069ce434fSBarry Smith 48169ce434fSBarry Smith Level: developer 48269ce434fSBarry Smith 48369ce434fSBarry Smith Notes: 48469ce434fSBarry Smith Call this after the call to PetscLayoutSetUp() 48569ce434fSBarry Smith 48669ce434fSBarry Smith Fortran Notes: 48769ce434fSBarry Smith Not available from Fortran 48869ce434fSBarry Smith 48969ce434fSBarry Smith .seealso: PetscLayoutCreate(), PetscLayoutSetLocalSize(), PetscLayoutGetLocalSize(), PetscLayoutSetSize(), PetscLayoutSetUp() 49069ce434fSBarry Smith PetscLayoutGetRange(), PetscLayoutGetRanges(), PetscLayoutSetBlockSize(), PetscLayoutGetSize() 49169ce434fSBarry Smith 49269ce434fSBarry Smith @*/ 49369ce434fSBarry Smith #undef __FUNCT__ 49469ce434fSBarry Smith #define __FUNCT__ "PetscLayoutGetBlockSize" 49569ce434fSBarry Smith PetscErrorCode PetscLayoutGetBlockSize(PetscLayout map,PetscInt *bs) 49669ce434fSBarry Smith { 49769ce434fSBarry Smith PetscFunctionBegin; 49869ce434fSBarry Smith *bs = map->bs; 49969ce434fSBarry Smith PetscFunctionReturn(0); 50069ce434fSBarry Smith } 50169ce434fSBarry Smith 50269ce434fSBarry Smith 50369ce434fSBarry Smith /*@C 50469ce434fSBarry Smith PetscLayoutGetRange - gets the range of values owned by this process 50569ce434fSBarry Smith 50669ce434fSBarry Smith Not Collective 50769ce434fSBarry Smith 50869ce434fSBarry Smith Input Parameters: 50969ce434fSBarry Smith . map - pointer to the map 51069ce434fSBarry Smith 51169ce434fSBarry Smith Output Parameters: 51269ce434fSBarry Smith + rstart - first index owned by this process 51369ce434fSBarry Smith - rend - one more than the last index owned by this process 51469ce434fSBarry Smith 51569ce434fSBarry Smith Level: developer 51669ce434fSBarry Smith 51769ce434fSBarry Smith Notes: 51869ce434fSBarry Smith Call this after the call to PetscLayoutSetUp() 51969ce434fSBarry Smith 52069ce434fSBarry Smith Fortran Notes: 52169ce434fSBarry Smith Not available from Fortran 52269ce434fSBarry Smith 52369ce434fSBarry Smith .seealso: PetscLayoutCreate(), PetscLayoutSetLocalSize(), PetscLayoutGetLocalSize(), PetscLayoutSetSize(), 52469ce434fSBarry Smith PetscLayoutGetSize(), PetscLayoutGetRanges(), PetscLayoutSetBlockSize(), PetscLayoutGetSize(), PetscLayoutSetUp() 52569ce434fSBarry Smith 52669ce434fSBarry Smith @*/ 52769ce434fSBarry Smith #undef __FUNCT__ 52869ce434fSBarry Smith #define __FUNCT__ "PetscLayoutGetRange" 52969ce434fSBarry Smith PetscErrorCode PetscLayoutGetRange(PetscLayout map,PetscInt *rstart,PetscInt *rend) 53069ce434fSBarry Smith { 53169ce434fSBarry Smith PetscFunctionBegin; 53269ce434fSBarry Smith if (rstart) *rstart = map->rstart; 53369ce434fSBarry Smith if (rend) *rend = map->rend; 53469ce434fSBarry Smith PetscFunctionReturn(0); 53569ce434fSBarry Smith } 53669ce434fSBarry Smith 53769ce434fSBarry Smith /*@C 53869ce434fSBarry Smith PetscLayoutGetRanges - gets the range of values owned by all processes 53969ce434fSBarry Smith 54069ce434fSBarry Smith Not Collective 54169ce434fSBarry Smith 54269ce434fSBarry Smith Input Parameters: 54369ce434fSBarry Smith . map - pointer to the map 54469ce434fSBarry Smith 54569ce434fSBarry Smith Output Parameters: 54669ce434fSBarry Smith . range - start of each processors range of indices (the final entry is one more then the 54769ce434fSBarry Smith last index on the last process) 54869ce434fSBarry Smith 54969ce434fSBarry Smith Level: developer 55069ce434fSBarry Smith 55169ce434fSBarry Smith Notes: 55269ce434fSBarry Smith Call this after the call to PetscLayoutSetUp() 55369ce434fSBarry Smith 55469ce434fSBarry Smith Fortran Notes: 55569ce434fSBarry Smith Not available from Fortran 55669ce434fSBarry Smith 55769ce434fSBarry Smith .seealso: PetscLayoutCreate(), PetscLayoutSetLocalSize(), PetscLayoutGetLocalSize(), PetscLayoutSetSize(), 55869ce434fSBarry Smith PetscLayoutGetSize(), PetscLayoutGetRange(), PetscLayoutSetBlockSize(), PetscLayoutGetSize(), PetscLayoutSetUp() 55969ce434fSBarry Smith 56069ce434fSBarry Smith @*/ 56169ce434fSBarry Smith #undef __FUNCT__ 56269ce434fSBarry Smith #define __FUNCT__ "PetscLayoutGetRanges" 56369ce434fSBarry Smith PetscErrorCode PetscLayoutGetRanges(PetscLayout map,const PetscInt *range[]) 56469ce434fSBarry Smith { 56569ce434fSBarry Smith PetscFunctionBegin; 56669ce434fSBarry Smith *range = map->range; 56769ce434fSBarry Smith PetscFunctionReturn(0); 56869ce434fSBarry Smith } 56969ce434fSBarry Smith 57069ce434fSBarry Smith #undef __FUNCT__ 57169ce434fSBarry Smith #define __FUNCT__ "PetscSFSetGraphLayout" 57269ce434fSBarry Smith /*@C 57369ce434fSBarry Smith PetscSFSetGraphLayout - Set a parallel star forest via global indices and a PetscLayout 57469ce434fSBarry Smith 57569ce434fSBarry Smith Collective 57669ce434fSBarry Smith 57769ce434fSBarry Smith Input Arguments: 57869ce434fSBarry Smith + sf - star forest 57969ce434fSBarry Smith . layout - PetscLayout defining the global space 58069ce434fSBarry Smith . nleaves - number of leaf vertices on the current process, each of these references a root on any process 58169ce434fSBarry Smith . ilocal - locations of leaves in leafdata buffers, pass NULL for contiguous storage 58269ce434fSBarry Smith - iremote - remote locations of root vertices for each leaf on the current process 58369ce434fSBarry Smith 58469ce434fSBarry Smith Level: intermediate 58569ce434fSBarry Smith 58669ce434fSBarry Smith .seealso: PetscSFCreate(), PetscSFView(), PetscSFSetGraph(), PetscSFGetGraph() 58769ce434fSBarry Smith @*/ 58869ce434fSBarry Smith PetscErrorCode PetscSFSetGraphLayout(PetscSF sf,PetscLayout layout,PetscInt nleaves,const PetscInt *ilocal,PetscCopyMode localmode,const PetscInt *iremote) 58969ce434fSBarry Smith { 59069ce434fSBarry Smith PetscErrorCode ierr; 59169ce434fSBarry Smith PetscInt i,nroots; 59269ce434fSBarry Smith PetscSFNode *remote; 59369ce434fSBarry Smith 59469ce434fSBarry Smith PetscFunctionBegin; 59569ce434fSBarry Smith ierr = PetscLayoutGetLocalSize(layout,&nroots);CHKERRQ(ierr); 596785e854fSJed Brown ierr = PetscMalloc1(nleaves,&remote);CHKERRQ(ierr); 59769ce434fSBarry Smith for (i=0; i<nleaves; i++) { 59869ce434fSBarry Smith PetscInt owner = -1; 59969ce434fSBarry Smith ierr = PetscLayoutFindOwner(layout,iremote[i],&owner);CHKERRQ(ierr); 60069ce434fSBarry Smith remote[i].rank = owner; 60169ce434fSBarry Smith remote[i].index = iremote[i] - layout->range[owner]; 60269ce434fSBarry Smith } 60369ce434fSBarry Smith ierr = PetscSFSetGraph(sf,nroots,nleaves,ilocal,localmode,remote,PETSC_OWN_POINTER);CHKERRQ(ierr); 60469ce434fSBarry Smith PetscFunctionReturn(0); 60569ce434fSBarry Smith } 60669ce434fSBarry Smith 607