1e1589f56SBarry Smith /* 2e1589f56SBarry Smith Objects to manage the interactions between the mesh data structures and the algebraic objects 3e1589f56SBarry Smith */ 426bd1501SBarry Smith #if !defined(PETSCDM_H) 526bd1501SBarry Smith #define PETSCDM_H 62c8e378dSBarry Smith #include <petscmat.h> 71e25c274SJed Brown #include <petscdmtypes.h> 8decb47aaSMatthew G. Knepley #include <petscfetypes.h> 92764a2aaSMatthew G. Knepley #include <petscdstypes.h> 10c58f1c22SToby Isaac #include <petscdmlabel.h> 11e1589f56SBarry Smith 12607a6623SBarry Smith PETSC_EXTERN PetscErrorCode DMInitializePackage(void); 13e1589f56SBarry Smith 14014dd563SJed Brown PETSC_EXTERN PetscClassId DM_CLASSID; 15d67d17b1SMatthew G. Knepley PETSC_EXTERN PetscClassId DMLABEL_CLASSID; 16e1589f56SBarry Smith 17528c63e0SDave May #define DMLOCATEPOINT_POINT_NOT_FOUND -367 18528c63e0SDave May 1976bdecfbSBarry Smith /*J 208f6c3df8SBarry Smith DMType - String with the name of a PETSc DM 21e1589f56SBarry Smith 22e1589f56SBarry Smith Level: beginner 23e1589f56SBarry Smith 24e1589f56SBarry Smith .seealso: DMSetType(), DM 2576bdecfbSBarry Smith J*/ 2619fd82e9SBarry Smith typedef const char* DMType; 27e1589f56SBarry Smith #define DMDA "da" 28e1589f56SBarry Smith #define DMCOMPOSITE "composite" 29e1589f56SBarry Smith #define DMSLICED "sliced" 30fe1899a2SJed Brown #define DMSHELL "shell" 31ab7f58a0SBarry Smith #define DMPLEX "plex" 328ac4e037SJed Brown #define DMREDUNDANT "redundant" 333a19ef87SMatthew G Knepley #define DMPATCH "patch" 341d72bce8STim Tautges #define DMMOAB "moab" 355f2c45f1SShri Abhyankar #define DMNETWORK "network" 36ef51cf95SToby Isaac #define DMFOREST "forest" 37db4d5e8cSToby Isaac #define DMP4EST "p4est" 38db4d5e8cSToby Isaac #define DMP8EST "p8est" 392fd35b1fSDave May #define DMSWARM "swarm" 40d852a638SPatrick Sanan #define DMPRODUCT "product" 41a3101111SPatrick Sanan #define DMSTAG "stag" 42e1589f56SBarry Smith 43bff4a2f0SMatthew G. Knepley PETSC_EXTERN const char *const DMBoundaryTypes[]; 4440967b3bSMatthew G. Knepley PETSC_EXTERN const char *const DMBoundaryConditionTypes[]; 45140e18c1SBarry Smith PETSC_EXTERN PetscFunctionList DMList; 46c0517cd5SMatthew G. Knepley PETSC_EXTERN DMGeneratorFunctionList DMGenerateList; 47014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMCreate(MPI_Comm,DM*); 4838221697SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMClone(DM,DM*); 4919fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode DMSetType(DM, DMType); 5019fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode DMGetType(DM, DMType *); 51bdf89e91SBarry Smith PETSC_EXTERN PetscErrorCode DMRegister(const char[],PetscErrorCode (*)(DM)); 52014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMRegisterDestroy(void); 53e1589f56SBarry Smith 54014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMView(DM,PetscViewer); 55014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMLoad(DM,PetscViewer); 56014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMDestroy(DM*); 57014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMCreateGlobalVector(DM,Vec*); 58014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMCreateLocalVector(DM,Vec*); 59014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMGetLocalVector(DM,Vec *); 60014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMRestoreLocalVector(DM,Vec *); 61014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMGetGlobalVector(DM,Vec *); 62014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMRestoreGlobalVector(DM,Vec *); 63014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMClearGlobalVectors(DM); 6450eeb1caSToby Isaac PETSC_EXTERN PetscErrorCode DMClearLocalVectors(DM); 65e77ac854SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMHasNamedGlobalVector(DM,const char*,PetscBool*); 66014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMGetNamedGlobalVector(DM,const char*,Vec*); 67014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMRestoreNamedGlobalVector(DM,const char*,Vec*); 68e77ac854SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMHasNamedLocalVector(DM,const char*,PetscBool*); 692348bcf4SPeter Brune PETSC_EXTERN PetscErrorCode DMGetNamedLocalVector(DM,const char*,Vec*); 702348bcf4SPeter Brune PETSC_EXTERN PetscErrorCode DMRestoreNamedLocalVector(DM,const char*,Vec*); 71014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMGetLocalToGlobalMapping(DM,ISLocalToGlobalMapping*); 72014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMCreateFieldIS(DM,PetscInt*,char***,IS**); 73014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMGetBlockSize(DM,PetscInt*); 74b412c318SBarry Smith PETSC_EXTERN PetscErrorCode DMCreateColoring(DM,ISColoringType,ISColoring*); 75b412c318SBarry Smith PETSC_EXTERN PetscErrorCode DMCreateMatrix(DM,Mat*); 76*aa0f6e3cSJed Brown PETSC_EXTERN PetscErrorCode DMSetMatrixPreallocateSkip(DM,PetscBool); 77014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMSetMatrixPreallocateOnly(DM,PetscBool); 78b06ff27eSHong Zhang PETSC_EXTERN PetscErrorCode DMSetMatrixStructureOnly(DM,PetscBool); 79014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMCreateInterpolation(DM,DM,Mat*,Vec*); 803ad4599aSBarry Smith PETSC_EXTERN PetscErrorCode DMCreateRestriction(DM,DM,Mat*); 816dbf9973SLawrence Mitchell PETSC_EXTERN PetscErrorCode DMCreateInjection(DM,DM,Mat*); 82bd041c0cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMCreateMassMatrix(DM,DM,Mat*); 83b4937a87SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMCreateMassMatrixLumped(DM,Vec*); 8469291d52SBarry Smith PETSC_EXTERN PetscErrorCode DMGetWorkArray(DM,PetscInt,MPI_Datatype,void*); 8569291d52SBarry Smith PETSC_EXTERN PetscErrorCode DMRestoreWorkArray(DM,PetscInt,MPI_Datatype,void*); 86014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMRefine(DM,MPI_Comm,DM*); 87014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMCoarsen(DM,MPI_Comm,DM*); 88a8fb8f29SToby Isaac PETSC_EXTERN PetscErrorCode DMGetCoarseDM(DM,DM*); 89a8fb8f29SToby Isaac PETSC_EXTERN PetscErrorCode DMSetCoarseDM(DM,DM); 9088bdff64SToby Isaac PETSC_EXTERN PetscErrorCode DMGetFineDM(DM,DM*); 9188bdff64SToby Isaac PETSC_EXTERN PetscErrorCode DMSetFineDM(DM,DM); 92014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMRefineHierarchy(DM,PetscInt,DM[]); 93014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMCoarsenHierarchy(DM,PetscInt,DM[]); 94014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMCoarsenHookAdd(DM,PetscErrorCode (*)(DM,DM,void*),PetscErrorCode (*)(DM,Mat,Vec,Mat,DM,void*),void*); 95dc822a44SJed Brown PETSC_EXTERN PetscErrorCode DMCoarsenHookRemove(DM,PetscErrorCode (*)(DM,DM,void*),PetscErrorCode (*)(DM,Mat,Vec,Mat,DM,void*),void*); 96014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMRefineHookAdd(DM,PetscErrorCode (*)(DM,DM,void*),PetscErrorCode (*)(DM,Mat,DM,void*),void*); 973d8e3701SJed Brown PETSC_EXTERN PetscErrorCode DMRefineHookRemove(DM,PetscErrorCode (*)(DM,DM,void*),PetscErrorCode (*)(DM,Mat,DM,void*),void*); 98014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMRestrict(DM,Mat,Vec,Mat,DM); 99014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMInterpolate(DM,Mat,DM); 1001f3379b2SToby Isaac PETSC_EXTERN PetscErrorCode DMInterpolateSolution(DM,DM,Mat,Vec,Vec); 101d410b0cfSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMExtrude(DM,PetscInt,DM*); 102014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMSetFromOptions(DM); 103fe2efc57SMark PETSC_EXTERN PetscErrorCode DMViewFromOptions(DM,PetscObject,const char[]); 104ca266f36SBarry Smith 105c0517cd5SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGenerate(DM, const char [], PetscBool , DM *); 1069fe9e680SJoe Wallwork PETSC_EXTERN PetscErrorCode DMGenerateRegister(const char[],PetscErrorCode (*)(DM,PetscBool,DM*),PetscErrorCode (*)(DM,PetscReal*,DM*),PetscErrorCode (*)(DM,Vec,DMLabel,DMLabel,DM*),PetscInt); 107c0517cd5SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGenerateRegisterAll(void); 108c0517cd5SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGenerateRegisterDestroy(void); 109a1b0c543SToby Isaac PETSC_EXTERN PetscErrorCode DMAdaptLabel(DM,DMLabel,DM*); 1109fe9e680SJoe Wallwork PETSC_EXTERN PetscErrorCode DMAdaptMetric(DM, Vec, DMLabel, DMLabel, DM *); 111df0b854cSToby Isaac 112014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMSetUp(DM); 113014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMCreateInterpolationScale(DM,DM,Mat,Vec*); 11497779f9aSLisandro Dalcin PETSC_EXTERN PETSC_DEPRECATED_FUNCTION("Use DMDACreateAggregates() or DMCreateRestriction() (since version 3.12)") PetscErrorCode DMCreateAggregates(DM,DM,Mat*); 115baf369e7SPeter Brune PETSC_EXTERN PetscErrorCode DMGlobalToLocalHookAdd(DM,PetscErrorCode (*)(DM,Vec,InsertMode,Vec,void*),PetscErrorCode (*)(DM,Vec,InsertMode,Vec,void*),void*); 116d4d07f1eSToby Isaac PETSC_EXTERN PetscErrorCode DMLocalToGlobalHookAdd(DM,PetscErrorCode (*)(DM,Vec,InsertMode,Vec,void*),PetscErrorCode (*)(DM,Vec,InsertMode,Vec,void*),void*); 11701729b5cSPatrick Sanan PETSC_EXTERN PetscErrorCode DMGlobalToLocal(DM,Vec,InsertMode,Vec); 118014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMGlobalToLocalBegin(DM,Vec,InsertMode,Vec); 119014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMGlobalToLocalEnd(DM,Vec,InsertMode,Vec); 12001729b5cSPatrick Sanan PETSC_EXTERN PetscErrorCode DMLocalToGlobal(DM,Vec,InsertMode,Vec); 121014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMLocalToGlobalBegin(DM,Vec,InsertMode,Vec); 122014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMLocalToGlobalEnd(DM,Vec,InsertMode,Vec); 123d78e899eSRichard Tran Mills PETSC_EXTERN PetscErrorCode DMLocalToLocalBegin(DM,Vec,InsertMode,Vec); 124d78e899eSRichard Tran Mills PETSC_EXTERN PetscErrorCode DMLocalToLocalEnd(DM,Vec,InsertMode,Vec); 12519fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode DMConvert(DM,DMType,DM*); 126e1589f56SBarry Smith 127c73cfb54SMatthew G. Knepley /* Topology support */ 128c73cfb54SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGetDimension(DM,PetscInt*); 129c73cfb54SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMSetDimension(DM,PetscInt); 130793f3fe5SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGetDimPoints(DM,PetscInt,PetscInt*,PetscInt*); 1318e4ac7eaSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGetUseNatural(DM,PetscBool*); 1328e4ac7eaSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMSetUseNatural(DM,PetscBool); 13346e270d4SMatthew G. Knepley 13446e270d4SMatthew G. Knepley /* Coordinate support */ 1356636e97aSMatthew G Knepley PETSC_EXTERN PetscErrorCode DMGetCoordinateDM(DM,DM*); 1361cfe2091SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMSetCoordinateDM(DM,DM); 13746e270d4SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGetCoordinateDim(DM,PetscInt*); 13846e270d4SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMSetCoordinateDim(DM,PetscInt); 139e8abe2deSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGetCoordinateSection(DM,PetscSection*); 14046e270d4SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMSetCoordinateSection(DM,PetscInt,PetscSection); 1416636e97aSMatthew G Knepley PETSC_EXTERN PetscErrorCode DMGetCoordinates(DM,Vec*); 1426636e97aSMatthew G Knepley PETSC_EXTERN PetscErrorCode DMSetCoordinates(DM,Vec); 1436636e97aSMatthew G Knepley PETSC_EXTERN PetscErrorCode DMGetCoordinatesLocal(DM,Vec*); 14481e9a530SVaclav Hapla PETSC_EXTERN PetscErrorCode DMGetCoordinatesLocalSetUp(DM); 14581e9a530SVaclav Hapla PETSC_EXTERN PetscErrorCode DMGetCoordinatesLocalNoncollective(DM,Vec*); 1462db98f8dSVaclav Hapla PETSC_EXTERN PetscErrorCode DMGetCoordinatesLocalTuple(DM,IS,PetscSection*,Vec*); 1476636e97aSMatthew G Knepley PETSC_EXTERN PetscErrorCode DMSetCoordinatesLocal(DM,Vec); 14862a38674SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMLocatePoints(DM,Vec,DMPointLocationType,PetscSF*); 14990b157c4SStefano Zampini PETSC_EXTERN PetscErrorCode DMGetPeriodicity(DM,PetscBool*,const PetscReal**,const PetscReal**,const DMBoundaryType**); 15090b157c4SStefano Zampini PETSC_EXTERN PetscErrorCode DMSetPeriodicity(DM,PetscBool,const PetscReal[],const PetscReal[],const DMBoundaryType[]); 151e907e85cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMLocalizeCoordinate(DM, const PetscScalar[], PetscBool, PetscScalar[]); 1522e17dfb7SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMLocalizeCoordinates(DM); 15336447a5eSToby Isaac PETSC_EXTERN PetscErrorCode DMGetCoordinatesLocalized(DM,PetscBool*); 1548f700142SStefano Zampini PETSC_EXTERN PetscErrorCode DMGetCoordinatesLocalizedLocal(DM,PetscBool*); 1553c73bf98SDave May PETSC_EXTERN PetscErrorCode DMGetNeighbors(DM,PetscInt*,const PetscMPIInt**); 156f19dbd58SToby Isaac PETSC_EXTERN PetscErrorCode DMGetCoordinateField(DM,DMField*); 157f19dbd58SToby Isaac PETSC_EXTERN PetscErrorCode DMSetCoordinateField(DM,DMField); 158b2e4378dSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGetBoundingBox(DM,PetscReal[],PetscReal[]); 159b2e4378dSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGetLocalBoundingBox(DM,PetscReal[],PetscReal[]); 160d864a3eaSLisandro Dalcin PETSC_EXTERN PetscErrorCode DMProjectCoordinates(DM,PetscFE); 1616636e97aSMatthew G Knepley 1625dbd56e3SPeter Brune /* block hook interface */ 163be081cd6SPeter Brune PETSC_EXTERN PetscErrorCode DMSubDomainHookAdd(DM,PetscErrorCode (*)(DM,DM,void*),PetscErrorCode (*)(DM,VecScatter,VecScatter,DM,void*),void*); 164b3a6b972SJed Brown PETSC_EXTERN PetscErrorCode DMSubDomainHookRemove(DM,PetscErrorCode (*)(DM,DM,void*),PetscErrorCode (*)(DM,VecScatter,VecScatter,DM,void*),void*); 165be081cd6SPeter Brune PETSC_EXTERN PetscErrorCode DMSubDomainRestrict(DM,VecScatter,VecScatter,DM); 1665dbd56e3SPeter Brune 167014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMSetOptionsPrefix(DM,const char []); 16831697293SDave May PETSC_EXTERN PetscErrorCode DMAppendOptionsPrefix(DM,const char []); 16931697293SDave May PETSC_EXTERN PetscErrorCode DMGetOptionsPrefix(DM,const char*[]); 17019fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode DMSetVecType(DM,VecType); 171c0dedaeaSBarry Smith PETSC_EXTERN PetscErrorCode DMGetVecType(DM,VecType*); 17219fd82e9SBarry Smith PETSC_EXTERN PetscErrorCode DMSetMatType(DM,MatType); 173c0dedaeaSBarry Smith PETSC_EXTERN PetscErrorCode DMGetMatType(DM,MatType*); 1748f1509bcSBarry Smith PETSC_EXTERN PetscErrorCode DMSetISColoringType(DM,ISColoringType); 1758f1509bcSBarry Smith PETSC_EXTERN PetscErrorCode DMGetISColoringType(DM,ISColoringType*); 176014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMSetApplicationContext(DM,void*); 177014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMSetApplicationContextDestroy(DM,PetscErrorCode (*)(void**)); 178014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMGetApplicationContext(DM,void*); 179014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMSetVariableBounds(DM,PetscErrorCode (*)(DM,Vec,Vec)); 180014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMHasVariableBounds(DM,PetscBool *); 181b0ae01b7SPeter Brune PETSC_EXTERN PetscErrorCode DMHasColoring(DM,PetscBool *); 1823ad4599aSBarry Smith PETSC_EXTERN PetscErrorCode DMHasCreateRestriction(DM,PetscBool *); 183a7058e45SLawrence Mitchell PETSC_EXTERN PetscErrorCode DMHasCreateInjection(DM,PetscBool *); 184014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMComputeVariableBounds(DM,Vec,Vec); 18593d92d96SBarry Smith 18637bc7515SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMCreateSubDM(DM, PetscInt, const PetscInt[], IS *, DM *); 1872adcc780SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMCreateSuperDM(DM[], PetscInt, IS **, DM *); 188792b654fSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMCreateSectionSubDM(DM,PetscInt,const PetscInt[],IS*,DM*); 189792b654fSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMCreateSectionSuperDM(DM[],PetscInt,IS**,DM*); 19016621825SDmitry Karpeev PETSC_EXTERN PetscErrorCode DMCreateFieldDecomposition(DM,PetscInt*,char***,IS**,DM**); 1918d4ac253SDmitry Karpeev PETSC_EXTERN PetscErrorCode DMCreateDomainDecomposition(DM,PetscInt*,char***,IS**,IS**,DM**); 192e30e807fSPeter Brune PETSC_EXTERN PetscErrorCode DMCreateDomainDecompositionScatters(DM,PetscInt,DM*,VecScatter**,VecScatter**,VecScatter**); 193e7c4fc90SDmitry Karpeev 194014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMGetRefineLevel(DM,PetscInt*); 195fef3a512SBarry Smith PETSC_EXTERN PetscErrorCode DMSetRefineLevel(DM,PetscInt); 196014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMGetCoarsenLevel(DM,PetscInt*); 1979a64c4a8SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMSetCoarsenLevel(DM,PetscInt); 198014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMFinalizePackage(void); 199e1589f56SBarry Smith 2005f1ad066SMatthew G Knepley PETSC_EXTERN PetscErrorCode VecGetDM(Vec, DM*); 2015f1ad066SMatthew G Knepley PETSC_EXTERN PetscErrorCode VecSetDM(Vec, DM); 202c688c046SMatthew G Knepley PETSC_EXTERN PetscErrorCode MatGetDM(Mat, DM*); 203c688c046SMatthew G Knepley PETSC_EXTERN PetscErrorCode MatSetDM(Mat, DM); 204531c7667SBarry Smith PETSC_EXTERN PetscErrorCode MatFDColoringUseDM(Mat,MatFDColoring); 2055f1ad066SMatthew G Knepley 206e1589f56SBarry Smith typedef struct NLF_DAAD* NLF; 207e1589f56SBarry Smith 208bc2bf880SBarry Smith #define DM_FILE_CLASSID 1211221 2097da65231SMatthew G Knepley 2107da65231SMatthew G Knepley /* FEM support */ 211014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMPrintCellVector(PetscInt, const char [], PetscInt, const PetscScalar []); 212014dd563SJed Brown PETSC_EXTERN PetscErrorCode DMPrintCellMatrix(PetscInt, const char [], PetscInt, PetscInt, const PetscScalar []); 2136113b454SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMPrintLocalVec(DM, const char [], PetscReal, Vec); 2147da65231SMatthew G Knepley 2158cda7954SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMSetNullSpaceConstructor(DM, PetscInt, PetscErrorCode (*)(DM, PetscInt, PetscInt, MatNullSpace *)); 2168cda7954SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGetNullSpaceConstructor(DM, PetscInt, PetscErrorCode (**)(DM, PetscInt, PetscInt, MatNullSpace *)); 2178cda7954SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMSetNearNullSpaceConstructor(DM, PetscInt, PetscErrorCode (*)(DM, PetscInt, PetscInt, MatNullSpace *)); 2188cda7954SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGetNearNullSpaceConstructor(DM, PetscInt, PetscErrorCode (**)(DM, PetscInt, PetscInt, MatNullSpace *)); 219f9d4088aSMatthew G. Knepley 220061576a5SJed Brown PETSC_EXTERN PetscErrorCode DMGetSection(DM, PetscSection *); /* Use DMGetLocalSection() in new code (since v3.12) */ 221061576a5SJed Brown PETSC_EXTERN PetscErrorCode DMSetSection(DM, PetscSection); /* Use DMSetLocalSection() in new code (since v3.12) */ 222061576a5SJed Brown PETSC_EXTERN PetscErrorCode DMGetLocalSection(DM, PetscSection *); 223061576a5SJed Brown PETSC_EXTERN PetscErrorCode DMSetLocalSection(DM, PetscSection); 224e87a4003SBarry Smith PETSC_EXTERN PetscErrorCode DMGetGlobalSection(DM, PetscSection *); 225e87a4003SBarry Smith PETSC_EXTERN PetscErrorCode DMSetGlobalSection(DM, PetscSection); 2269fbee547SJacob Faibussowitsch static inline PETSC_DEPRECATED_FUNCTION("Use DMGetSection() (since v3.9)") PetscErrorCode DMGetDefaultSection(DM dm, PetscSection *s) {return DMGetSection(dm,s);} 2279fbee547SJacob Faibussowitsch static inline PETSC_DEPRECATED_FUNCTION("Use DMSetSection() (since v3.9)") PetscErrorCode DMSetDefaultSection(DM dm, PetscSection s) {return DMSetSection(dm,s);} 2289fbee547SJacob Faibussowitsch static inline PETSC_DEPRECATED_FUNCTION("Use DMGetGlobalSection() (since v3.9)") PetscErrorCode DMGetDefaultGlobalSection(DM dm, PetscSection *s) {return DMGetGlobalSection(dm,s);} 2299fbee547SJacob Faibussowitsch static inline PETSC_DEPRECATED_FUNCTION("Use DMSetGlobalSection() (since v3.9)") PetscErrorCode DMSetDefaultGlobalSection(DM dm, PetscSection s) {return DMSetGlobalSection(dm,s);} 230e87a4003SBarry Smith 2311bb6d2a8SBarry Smith PETSC_EXTERN PetscErrorCode DMGetSectionSF(DM, PetscSF*); 2321bb6d2a8SBarry Smith PETSC_EXTERN PetscErrorCode DMSetSectionSF(DM, PetscSF); 2331bb6d2a8SBarry Smith PETSC_EXTERN PetscErrorCode DMCreateSectionSF(DM, PetscSection, PetscSection); 2349fbee547SJacob Faibussowitsch static inline PETSC_DEPRECATED_FUNCTION("Use DMGetSectionSF() (since v3.12)") PetscErrorCode DMGetDefaultSF(DM dm, PetscSF *s) {return DMGetSectionSF(dm,s);} 2359fbee547SJacob Faibussowitsch static inline PETSC_DEPRECATED_FUNCTION("Use DMSetSectionSF() (since v3.12)") PetscErrorCode DMSetDefaultSF(DM dm, PetscSF s) {return DMSetSectionSF(dm,s);} 2369fbee547SJacob Faibussowitsch static inline PETSC_DEPRECATED_FUNCTION("Use DMCreateSectionSF() (since v3.12)") PetscErrorCode DMCreateDefaultSF(DM dm, PetscSection l, PetscSection g) {return DMCreateSectionSF(dm,l,g);} 2371bb6d2a8SBarry Smith PETSC_EXTERN PetscErrorCode DMGetPointSF(DM, PetscSF *); 2381bb6d2a8SBarry Smith PETSC_EXTERN PetscErrorCode DMSetPointSF(DM, PetscSF); 2394f37162bSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGetNaturalSF(DM, PetscSF *); 2404f37162bSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMSetNaturalSF(DM, PetscSF); 2411bb6d2a8SBarry Smith 24279769bd5SJed Brown PETSC_EXTERN PetscErrorCode DMGetDefaultConstraints(DM, PetscSection *, Mat *, Vec *); 24379769bd5SJed Brown PETSC_EXTERN PetscErrorCode DMSetDefaultConstraints(DM, PetscSection, Mat, Vec); 244e87a4003SBarry Smith 24514f150ffSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGetOutputDM(DM, DM *); 246cdb7a50dSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGetOutputSequenceNumber(DM, PetscInt *, PetscReal *); 247cdb7a50dSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMSetOutputSequenceNumber(DM, PetscInt, PetscReal); 248cdb7a50dSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMOutputSequenceLoad(DM, PetscViewer, const char *, PetscInt, PetscReal *); 24914f150ffSMatthew G. Knepley 250af122d2aSMatthew G Knepley PETSC_EXTERN PetscErrorCode DMGetNumFields(DM, PetscInt *); 251af122d2aSMatthew G Knepley PETSC_EXTERN PetscErrorCode DMSetNumFields(DM, PetscInt); 25244a7f3ddSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGetField(DM, PetscInt, DMLabel *, PetscObject *); 25344a7f3ddSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMSetField(DM, PetscInt, DMLabel, PetscObject); 25444a7f3ddSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMAddField(DM, DMLabel, PetscObject); 255e0b68406SMatthew Knepley PETSC_EXTERN PetscErrorCode DMSetFieldAvoidTensor(DM, PetscInt, PetscBool); 256e0b68406SMatthew Knepley PETSC_EXTERN PetscErrorCode DMGetFieldAvoidTensor(DM, PetscInt, PetscBool *); 25744a7f3ddSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMClearFields(DM); 258e5e52638SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMCopyFields(DM, DM); 25934aa8a36SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGetAdjacency(DM, PetscInt, PetscBool *, PetscBool *); 26034aa8a36SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMSetAdjacency(DM, PetscInt, PetscBool, PetscBool); 261b0441da4SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGetBasicAdjacency(DM, PetscBool *, PetscBool *); 262b0441da4SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMSetBasicAdjacency(DM, PetscBool, PetscBool); 263e5e52638SMatthew G. Knepley 264e5e52638SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGetNumDS(DM, PetscInt *); 265e5e52638SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGetDS(DM, PetscDS *); 266e5e52638SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGetCellDS(DM, PetscInt, PetscDS *); 267b3cf3223SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGetRegionDS(DM, DMLabel, IS *, PetscDS *); 268b3cf3223SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMSetRegionDS(DM, DMLabel, IS, PetscDS); 269b3cf3223SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGetRegionNumDS(DM, PetscInt, DMLabel *, IS *, PetscDS *); 270083401c6SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMSetRegionNumDS(DM, PetscInt, DMLabel, IS, PetscDS); 2711d3af9e0SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMFindRegionNum(DM, PetscDS, PetscInt *); 2722df84da0SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMCreateFEDefault(DM, PetscInt, const char[], PetscInt, PetscFE *); 273e5e52638SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMCreateDS(DM); 274e5e52638SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMClearDS(DM); 275e5e52638SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMCopyDS(DM, DM); 276e5e52638SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMCopyDisc(DM, DM); 277f2cacb80SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMComputeExactSolution(DM, PetscReal, Vec, Vec); 2789a2a23afSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGetNumAuxiliaryVec(DM, PetscInt *); 2799a2a23afSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGetAuxiliaryVec(DM, DMLabel, PetscInt, Vec *); 2809a2a23afSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMSetAuxiliaryVec(DM, DMLabel, PetscInt, Vec); 2819a2a23afSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMGetAuxiliaryLabels(DM, DMLabel[], PetscInt[]); 2829a2a23afSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMCopyAuxiliaryVec(DM, DM); 283af122d2aSMatthew G Knepley 2844267b1a3SMatthew G. Knepley /*MC 2854267b1a3SMatthew G. Knepley DMInterpolationInfo - Structure for holding information about interpolation on a mesh 2864267b1a3SMatthew G. Knepley 2874267b1a3SMatthew G. Knepley Level: intermediate 2884267b1a3SMatthew G. Knepley 2894267b1a3SMatthew G. Knepley Synopsis: 2904267b1a3SMatthew G. Knepley comm - The communicator 2914267b1a3SMatthew G. Knepley dim - The spatial dimension of points 2924267b1a3SMatthew G. Knepley nInput - The number of input points 2934267b1a3SMatthew G. Knepley points - The input point coordinates 2944267b1a3SMatthew G. Knepley cells - The cell containing each point 2954267b1a3SMatthew G. Knepley n - The number of local points 2964267b1a3SMatthew G. Knepley coords - The point coordinates 2974267b1a3SMatthew G. Knepley dof - The number of components to interpolate 2984267b1a3SMatthew G. Knepley 2994267b1a3SMatthew G. Knepley .seealso: DMInterpolationCreate(), DMInterpolationEvaluate(), DMInterpolationAddPoints() 3004267b1a3SMatthew G. Knepley M*/ 301e87bb0d3SMatthew G Knepley struct _DMInterpolationInfo { 302e87bb0d3SMatthew G Knepley MPI_Comm comm; 303e87bb0d3SMatthew G Knepley PetscInt dim; /*1 The spatial dimension of points */ 304e87bb0d3SMatthew G Knepley PetscInt nInput; /* The number of input points */ 305e87bb0d3SMatthew G Knepley PetscReal *points; /* The input point coordinates */ 306e87bb0d3SMatthew G Knepley PetscInt *cells; /* The cell containing each point */ 307e87bb0d3SMatthew G Knepley PetscInt n; /* The number of local points */ 308e87bb0d3SMatthew G Knepley Vec coords; /* The point coordinates */ 309e87bb0d3SMatthew G Knepley PetscInt dof; /* The number of components to interpolate */ 310e87bb0d3SMatthew G Knepley }; 311e87bb0d3SMatthew G Knepley typedef struct _DMInterpolationInfo *DMInterpolationInfo; 312e87bb0d3SMatthew G Knepley 31394b4b8a8SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMInterpolationCreate(MPI_Comm, DMInterpolationInfo *); 31494b4b8a8SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMInterpolationSetDim(DMInterpolationInfo, PetscInt); 31594b4b8a8SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMInterpolationGetDim(DMInterpolationInfo, PetscInt *); 31694b4b8a8SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMInterpolationSetDof(DMInterpolationInfo, PetscInt); 31794b4b8a8SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMInterpolationGetDof(DMInterpolationInfo, PetscInt *); 31894b4b8a8SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMInterpolationAddPoints(DMInterpolationInfo, PetscInt, PetscReal[]); 31952aa1562SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMInterpolationSetUp(DMInterpolationInfo, DM, PetscBool, PetscBool); 32094b4b8a8SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMInterpolationGetCoordinates(DMInterpolationInfo, Vec *); 32194b4b8a8SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMInterpolationGetVector(DMInterpolationInfo, Vec *); 32294b4b8a8SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMInterpolationRestoreVector(DMInterpolationInfo, Vec *); 32394b4b8a8SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMInterpolationEvaluate(DMInterpolationInfo, DM, Vec, Vec); 32494b4b8a8SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMInterpolationDestroy(DMInterpolationInfo *); 325c58f1c22SToby Isaac 326c58f1c22SToby Isaac PETSC_EXTERN PetscErrorCode DMCreateLabel(DM, const char []); 327c58f1c22SToby Isaac PETSC_EXTERN PetscErrorCode DMGetLabelValue(DM, const char[], PetscInt, PetscInt *); 328c58f1c22SToby Isaac PETSC_EXTERN PetscErrorCode DMSetLabelValue(DM, const char[], PetscInt, PetscInt); 329c58f1c22SToby Isaac PETSC_EXTERN PetscErrorCode DMClearLabelValue(DM, const char[], PetscInt, PetscInt); 330c58f1c22SToby Isaac PETSC_EXTERN PetscErrorCode DMGetLabelSize(DM, const char[], PetscInt *); 331c58f1c22SToby Isaac PETSC_EXTERN PetscErrorCode DMGetLabelIdIS(DM, const char[], IS *); 332c58f1c22SToby Isaac PETSC_EXTERN PetscErrorCode DMGetStratumSize(DM, const char [], PetscInt, PetscInt *); 333c58f1c22SToby Isaac PETSC_EXTERN PetscErrorCode DMGetStratumIS(DM, const char [], PetscInt, IS *); 3344de306b1SToby Isaac PETSC_EXTERN PetscErrorCode DMSetStratumIS(DM, const char [], PetscInt, IS); 335c58f1c22SToby Isaac PETSC_EXTERN PetscErrorCode DMClearLabelStratum(DM, const char[], PetscInt); 336c58f1c22SToby Isaac PETSC_EXTERN PetscErrorCode DMGetLabelOutput(DM, const char[], PetscBool *); 337c58f1c22SToby Isaac PETSC_EXTERN PetscErrorCode DMSetLabelOutput(DM, const char[], PetscBool); 3385f15299fSJeremy L Thompson PETSC_EXTERN PetscErrorCode DMGetFirstLabeledPoint(DM, DM, DMLabel, PetscInt, const PetscInt *, PetscInt, PetscInt *, PetscDS *); 339c58f1c22SToby Isaac 3402cbb9b06SVaclav Hapla /*E 3412cbb9b06SVaclav Hapla DMCopyLabelsMode - Determines how DMCopyLabels() behaves when there is a DMLabel in the source and destination DMs with the same name 3422cbb9b06SVaclav Hapla 3432cbb9b06SVaclav Hapla Level: advanced 3442cbb9b06SVaclav Hapla 3452cbb9b06SVaclav Hapla $ DM_COPY_LABELS_REPLACE - replace label in destination by label from source 3462cbb9b06SVaclav Hapla $ DM_COPY_LABELS_KEEP - keep destination label 3472cbb9b06SVaclav Hapla $ DM_COPY_LABELS_FAIL - throw error 3482cbb9b06SVaclav Hapla 3492cbb9b06SVaclav Hapla E*/ 3502cbb9b06SVaclav Hapla typedef enum {DM_COPY_LABELS_REPLACE, DM_COPY_LABELS_KEEP, DM_COPY_LABELS_FAIL} DMCopyLabelsMode; 3512cbb9b06SVaclav Hapla PETSC_EXTERN const char *const DMCopyLabelsModes[]; 3522cbb9b06SVaclav Hapla 353c58f1c22SToby Isaac PETSC_EXTERN PetscErrorCode DMGetNumLabels(DM, PetscInt *); 354c58f1c22SToby Isaac PETSC_EXTERN PetscErrorCode DMGetLabelName(DM, PetscInt, const char **); 355c58f1c22SToby Isaac PETSC_EXTERN PetscErrorCode DMHasLabel(DM, const char [], PetscBool *); 356c58f1c22SToby Isaac PETSC_EXTERN PetscErrorCode DMGetLabel(DM, const char *, DMLabel *); 3574a7ee7d0SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMSetLabel(DM, DMLabel); 358c58f1c22SToby Isaac PETSC_EXTERN PetscErrorCode DMGetLabelByNum(DM, PetscInt, DMLabel *); 359c58f1c22SToby Isaac PETSC_EXTERN PetscErrorCode DMAddLabel(DM, DMLabel); 360c58f1c22SToby Isaac PETSC_EXTERN PetscErrorCode DMRemoveLabel(DM, const char [], DMLabel *); 361306894acSVaclav Hapla PETSC_EXTERN PetscErrorCode DMRemoveLabelBySelf(DM, DMLabel *, PetscBool); 3622cbb9b06SVaclav Hapla PETSC_EXTERN PetscErrorCode DMCopyLabels(DM, DM, PetscCopyMode, PetscBool, DMCopyLabelsMode emode); 363609dae6eSVaclav Hapla PETSC_EXTERN PetscErrorCode DMCompareLabels(DM, DM, PetscBool *, char **); 364c58f1c22SToby Isaac 36545480ffeSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMAddBoundary(DM, DMBoundaryConditionType, const char[], DMLabel, PetscInt, const PetscInt[], PetscInt, PetscInt, const PetscInt[], void (*)(void), void (*)(void), void *, PetscInt *); 366a6ba4734SToby Isaac PETSC_EXTERN PetscErrorCode DMIsBoundaryPoint(DM, PetscInt, PetscBool *); 3674d6f44ffSToby Isaac 3680709b2feSToby Isaac PETSC_EXTERN PetscErrorCode DMProjectFunction(DM,PetscReal,PetscErrorCode(**)(PetscInt,PetscReal,const PetscReal[],PetscInt,PetscScalar *,void *),void**,InsertMode,Vec); 3690709b2feSToby Isaac PETSC_EXTERN PetscErrorCode DMProjectFunctionLocal(DM,PetscReal,PetscErrorCode(**)(PetscInt,PetscReal,const PetscReal[],PetscInt,PetscScalar *,void *),void**,InsertMode,Vec); 3702c53366bSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMProjectFunctionLabel(DM, PetscReal, DMLabel, PetscInt, const PetscInt[], PetscInt, const PetscInt[], PetscErrorCode (**)(PetscInt, PetscReal, const PetscReal [], PetscInt, PetscScalar *, void *), void **, InsertMode, Vec); 3711c531cf8SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMProjectFunctionLabelLocal(DM,PetscReal,DMLabel,PetscInt,const PetscInt[],PetscInt,const PetscInt[],PetscErrorCode(**)(PetscInt,PetscReal,const PetscReal[],PetscInt,PetscScalar *,void *),void **,InsertMode,Vec); 372191494d9SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMProjectFieldLocal(DM,PetscReal,Vec,void (**)(PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[],const PetscScalar[],const PetscScalar[],const PetscInt[],const PetscInt[],const PetscScalar[],const PetscScalar[],const PetscScalar[],PetscReal,const PetscReal[],PetscInt,const PetscScalar[],PetscScalar[]),InsertMode,Vec); 3731c531cf8SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMProjectFieldLabelLocal(DM,PetscReal,DMLabel,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Vec,void (**)(PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[],const PetscScalar[],const PetscScalar[],const PetscInt[],const PetscInt[],const PetscScalar[],const PetscScalar[],const PetscScalar[],PetscReal,const PetscReal[],PetscInt,const PetscScalar[],PetscScalar[]),InsertMode,Vec); 374ece3a9fcSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMProjectBdFieldLabelLocal(DM,PetscReal,DMLabel,PetscInt,const PetscInt[],PetscInt,const PetscInt[],Vec,void (**)(PetscInt,PetscInt,PetscInt,const PetscInt[],const PetscInt[],const PetscScalar[],const PetscScalar[],const PetscScalar[],const PetscInt[],const PetscInt[],const PetscScalar[],const PetscScalar[],const PetscScalar[],PetscReal,const PetscReal[],const PetscReal[],PetscInt,const PetscScalar[],PetscScalar[]),InsertMode,Vec); 3750709b2feSToby Isaac PETSC_EXTERN PetscErrorCode DMComputeL2Diff(DM,PetscReal,PetscErrorCode(**)(PetscInt,PetscReal,const PetscReal[],PetscInt,PetscScalar *,void *),void **,Vec,PetscReal *); 376b698f381SToby Isaac PETSC_EXTERN PetscErrorCode DMComputeL2GradientDiff(DM, PetscReal, PetscErrorCode (**)(PetscInt, PetscReal, const PetscReal [], const PetscReal [], PetscInt, PetscScalar *, void *), void **, Vec, const PetscReal [], PetscReal *); 3771189c1efSToby Isaac PETSC_EXTERN PetscErrorCode DMComputeL2FieldDiff(DM,PetscReal,PetscErrorCode(**)(PetscInt,PetscReal,const PetscReal[],PetscInt,PetscScalar *,void *),void **,Vec,PetscReal *); 3782e4af2aeSMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMComputeError(DM, Vec, PetscReal[], Vec *); 379ca3d3a14SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMHasBasisTransform(DM,PetscBool*); 380ca3d3a14SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMCopyTransform(DM, DM); 3818320bc6fSPatrick Sanan 3828320bc6fSPatrick Sanan PETSC_EXTERN PetscErrorCode DMGetCompatibility(DM,DM,PetscBool*,PetscBool*); 383c0f0dcc3SMatthew G. Knepley 384c0f0dcc3SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMMonitorSet(DM, PetscErrorCode (*)(DM, void *), void *, PetscErrorCode (*)(void**)); 385c0f0dcc3SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMMonitorCancel(DM); 386c0f0dcc3SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMMonitorSetFromOptions(DM, const char[], const char[], const char[], PetscErrorCode (*)(DM, void *), PetscErrorCode (*)(DM, PetscViewerAndFormat *), PetscBool *); 387c0f0dcc3SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMMonitor(DM); 388c0f0dcc3SMatthew G. Knepley 3899fbee547SJacob Faibussowitsch static inline PetscInt DMPolytopeTypeGetDim(DMPolytopeType ct) 39070a7d78aSStefano Zampini { 391412e9a14SMatthew G. Knepley switch (ct) { 392412e9a14SMatthew G. Knepley case DM_POLYTOPE_POINT: 393412e9a14SMatthew G. Knepley return 0; 394412e9a14SMatthew G. Knepley case DM_POLYTOPE_SEGMENT: 395412e9a14SMatthew G. Knepley case DM_POLYTOPE_POINT_PRISM_TENSOR: 396412e9a14SMatthew G. Knepley return 1; 397412e9a14SMatthew G. Knepley case DM_POLYTOPE_TRIANGLE: 398412e9a14SMatthew G. Knepley case DM_POLYTOPE_QUADRILATERAL: 399412e9a14SMatthew G. Knepley case DM_POLYTOPE_SEG_PRISM_TENSOR: 400412e9a14SMatthew G. Knepley return 2; 401412e9a14SMatthew G. Knepley case DM_POLYTOPE_TETRAHEDRON: 402412e9a14SMatthew G. Knepley case DM_POLYTOPE_HEXAHEDRON: 403412e9a14SMatthew G. Knepley case DM_POLYTOPE_TRI_PRISM: 404412e9a14SMatthew G. Knepley case DM_POLYTOPE_TRI_PRISM_TENSOR: 405412e9a14SMatthew G. Knepley case DM_POLYTOPE_QUAD_PRISM_TENSOR: 406da9060c4SMatthew G. Knepley case DM_POLYTOPE_PYRAMID: 407412e9a14SMatthew G. Knepley return 3; 408412e9a14SMatthew G. Knepley default: return -1; 409412e9a14SMatthew G. Knepley } 410412e9a14SMatthew G. Knepley } 411412e9a14SMatthew G. Knepley 4129fbee547SJacob Faibussowitsch static inline PetscInt DMPolytopeTypeGetConeSize(DMPolytopeType ct) 413412e9a14SMatthew G. Knepley { 414412e9a14SMatthew G. Knepley switch (ct) { 415412e9a14SMatthew G. Knepley case DM_POLYTOPE_POINT: return 0; 416412e9a14SMatthew G. Knepley case DM_POLYTOPE_SEGMENT: return 2; 417412e9a14SMatthew G. Knepley case DM_POLYTOPE_POINT_PRISM_TENSOR: return 2; 418412e9a14SMatthew G. Knepley case DM_POLYTOPE_TRIANGLE: return 3; 419412e9a14SMatthew G. Knepley case DM_POLYTOPE_QUADRILATERAL: return 4; 420412e9a14SMatthew G. Knepley case DM_POLYTOPE_SEG_PRISM_TENSOR: return 4; 421412e9a14SMatthew G. Knepley case DM_POLYTOPE_TETRAHEDRON: return 4; 422412e9a14SMatthew G. Knepley case DM_POLYTOPE_HEXAHEDRON: return 6; 423412e9a14SMatthew G. Knepley case DM_POLYTOPE_TRI_PRISM: return 5; 424412e9a14SMatthew G. Knepley case DM_POLYTOPE_TRI_PRISM_TENSOR: return 5; 425412e9a14SMatthew G. Knepley case DM_POLYTOPE_QUAD_PRISM_TENSOR: return 6; 426da9060c4SMatthew G. Knepley case DM_POLYTOPE_PYRAMID: return 5; 427412e9a14SMatthew G. Knepley default: return -1; 428412e9a14SMatthew G. Knepley } 429412e9a14SMatthew G. Knepley } 430412e9a14SMatthew G. Knepley 4319fbee547SJacob Faibussowitsch static inline PetscInt DMPolytopeTypeGetNumVertices(DMPolytopeType ct) 432412e9a14SMatthew G. Knepley { 433412e9a14SMatthew G. Knepley switch (ct) { 434412e9a14SMatthew G. Knepley case DM_POLYTOPE_POINT: return 1; 435412e9a14SMatthew G. Knepley case DM_POLYTOPE_SEGMENT: return 2; 436412e9a14SMatthew G. Knepley case DM_POLYTOPE_POINT_PRISM_TENSOR: return 2; 437412e9a14SMatthew G. Knepley case DM_POLYTOPE_TRIANGLE: return 3; 438412e9a14SMatthew G. Knepley case DM_POLYTOPE_QUADRILATERAL: return 4; 439412e9a14SMatthew G. Knepley case DM_POLYTOPE_SEG_PRISM_TENSOR: return 4; 440412e9a14SMatthew G. Knepley case DM_POLYTOPE_TETRAHEDRON: return 4; 441412e9a14SMatthew G. Knepley case DM_POLYTOPE_HEXAHEDRON: return 8; 442412e9a14SMatthew G. Knepley case DM_POLYTOPE_TRI_PRISM: return 6; 443412e9a14SMatthew G. Knepley case DM_POLYTOPE_TRI_PRISM_TENSOR: return 6; 444412e9a14SMatthew G. Knepley case DM_POLYTOPE_QUAD_PRISM_TENSOR: return 8; 445da9060c4SMatthew G. Knepley case DM_POLYTOPE_PYRAMID: return 5; 446412e9a14SMatthew G. Knepley default: return -1; 447412e9a14SMatthew G. Knepley } 448412e9a14SMatthew G. Knepley } 449412e9a14SMatthew G. Knepley 4509fbee547SJacob Faibussowitsch static inline DMPolytopeType DMPolytopeTypeSimpleShape(PetscInt dim, PetscBool simplex) 4519318fe57SMatthew G. Knepley { 4529318fe57SMatthew G. Knepley return dim == 0 ? DM_POLYTOPE_POINT : 4539318fe57SMatthew G. Knepley (dim == 1 ? DM_POLYTOPE_SEGMENT : 4549318fe57SMatthew G. Knepley (dim == 2 ? (simplex ? DM_POLYTOPE_TRIANGLE : DM_POLYTOPE_QUADRILATERAL) : 4559318fe57SMatthew G. Knepley (dim == 3 ? (simplex ? DM_POLYTOPE_TETRAHEDRON : DM_POLYTOPE_HEXAHEDRON) : DM_POLYTOPE_UNKNOWN))); 4569318fe57SMatthew G. Knepley } 4579318fe57SMatthew G. Knepley 4589fbee547SJacob Faibussowitsch static inline PetscInt DMPolytopeTypeGetNumArrangments(DMPolytopeType ct) 459b5a892a1SMatthew G. Knepley { 460b5a892a1SMatthew G. Knepley switch (ct) { 461b5a892a1SMatthew G. Knepley case DM_POLYTOPE_POINT: return 1; 462b5a892a1SMatthew G. Knepley case DM_POLYTOPE_SEGMENT: return 2; 463b5a892a1SMatthew G. Knepley case DM_POLYTOPE_POINT_PRISM_TENSOR: return 2; 464b5a892a1SMatthew G. Knepley case DM_POLYTOPE_TRIANGLE: return 6; 465b5a892a1SMatthew G. Knepley case DM_POLYTOPE_QUADRILATERAL: return 8; 466b5a892a1SMatthew G. Knepley case DM_POLYTOPE_SEG_PRISM_TENSOR: return 4; 467b5a892a1SMatthew G. Knepley case DM_POLYTOPE_TETRAHEDRON: return 24; 468b5a892a1SMatthew G. Knepley case DM_POLYTOPE_HEXAHEDRON: return 48; 469b5a892a1SMatthew G. Knepley case DM_POLYTOPE_TRI_PRISM: return 12; 470b5a892a1SMatthew G. Knepley case DM_POLYTOPE_TRI_PRISM_TENSOR: return 12; 471b5a892a1SMatthew G. Knepley case DM_POLYTOPE_QUAD_PRISM_TENSOR: return 16; 472b5a892a1SMatthew G. Knepley case DM_POLYTOPE_PYRAMID: return 8; 473b5a892a1SMatthew G. Knepley default: return -1; 474b5a892a1SMatthew G. Knepley } 475b5a892a1SMatthew G. Knepley } 476b5a892a1SMatthew G. Knepley 477b5a892a1SMatthew G. Knepley /* An arrangement is a face order combined with an orientation for each face */ 4789fbee547SJacob Faibussowitsch static inline const PetscInt *DMPolytopeTypeGetArrangment(DMPolytopeType ct, PetscInt o) 479b5a892a1SMatthew G. Knepley { 480ef8b56bfSJed Brown static const PetscInt pntArr[1*2] = {0, 0}; 481b5a892a1SMatthew G. Knepley /* a: swap */ 482ef8b56bfSJed Brown static const PetscInt segArr[2*2*2] = { 483b5a892a1SMatthew G. Knepley 1, 0, 0, 0, /* -1: a */ 484b5a892a1SMatthew G. Knepley 0, 0, 1, 0, /* 0: e */}; 485b5a892a1SMatthew G. Knepley /* a: swap first two 486b5a892a1SMatthew G. Knepley b: swap last two */ 487ef8b56bfSJed Brown static const PetscInt triArr[6*3*2] = { 488b5a892a1SMatthew G. Knepley 0, -1, 2, -1, 1, -1, /* -3: b */ 489b5a892a1SMatthew G. Knepley 2, -1, 1, -1, 0, -1, /* -2: aba */ 490b5a892a1SMatthew G. Knepley 1, -1, 0, -1, 2, -1, /* -1: a */ 491b5a892a1SMatthew G. Knepley 0, 0, 1, 0, 2, 0, /* 0: identity */ 492b5a892a1SMatthew G. Knepley 1, 0, 2, 0, 0, 0, /* 1: ba */ 493b5a892a1SMatthew G. Knepley 2, 0, 0, 0, 1, 0, /* 2: ab */}; 494b5a892a1SMatthew G. Knepley /* a: forward cyclic permutation 495b5a892a1SMatthew G. Knepley b: swap first and last pairs */ 496ef8b56bfSJed Brown static const PetscInt quadArr[8*4*2] = { 497b5a892a1SMatthew G. Knepley 1, -1, 0, -1, 3, -1, 2, -1, /* -4: b */ 498b5a892a1SMatthew G. Knepley 0, -1, 3, -1, 2, -1, 1, -1, /* -3: b a^3 = a b */ 499b5a892a1SMatthew G. Knepley 3, -1, 2, -1, 1, -1, 0, -1, /* -2: b a^2 = a^2 b */ 500b5a892a1SMatthew G. Knepley 2, -1, 1, -1, 0, -1, 3, -1, /* -1: b a = a^3 b */ 501b5a892a1SMatthew G. Knepley 0, 0, 1, 0, 2, 0, 3, 0, /* 0: identity */ 502b5a892a1SMatthew G. Knepley 1, 0, 2, 0, 3, 0, 0, 0, /* 1: a */ 503b5a892a1SMatthew G. Knepley 2, 0, 3, 0, 0, 0, 1, 0, /* 2: a^2 */ 504b5a892a1SMatthew G. Knepley 3, 0, 0, 0, 1, 0, 2, 0, /* 3: a^3 */}; 505b5a892a1SMatthew G. Knepley /* r: rotate 180 506b5a892a1SMatthew G. Knepley b: swap top and bottom segments */ 507ef8b56bfSJed Brown static const PetscInt tsegArr[4*4*2] = { 508b5a892a1SMatthew G. Knepley 1, -1, 0, -1, 3, -1, 2, -1, /* -2: r b */ 509b5a892a1SMatthew G. Knepley 0, -1, 1, -1, 3, 0, 2, 0, /* -1: r */ 510b5a892a1SMatthew G. Knepley 0, 0, 1, 0, 2, 0, 3, 0, /* 0: identity */ 511b5a892a1SMatthew G. Knepley 1, 0, 0, 0, 2, -1, 3, -1, /* 1: b */}; 512b5a892a1SMatthew G. Knepley /* https://en.wikiversity.org/wiki/Symmetric_group_S4 */ 513ef8b56bfSJed Brown static const PetscInt tetArr[24*4*2] = { 514b5a892a1SMatthew G. Knepley 3, -2, 2, -3, 0, -1, 1, -1, /* -12: (1324) p22 */ 515b5a892a1SMatthew G. Knepley 3, -1, 1, -3, 2, -1, 0, -1, /* -11: (14) p21 */ 516b5a892a1SMatthew G. Knepley 3, -3, 0, -3, 1, -1, 2, -1, /* -10: (1234) p18 */ 517b5a892a1SMatthew G. Knepley 2, -1, 3, -1, 1, -3, 0, -2, /* -9: (1423) p17 */ 518b5a892a1SMatthew G. Knepley 2, -3, 0, -1, 3, -2, 1, -3, /* -8: (1342) p13 */ 519b5a892a1SMatthew G. Knepley 2, -2, 1, -2, 0, -2, 3, -2, /* -7: (24) p14 */ 520b5a892a1SMatthew G. Knepley 1, -2, 0, -2, 2, -2, 3, -1, /* -6: (34) p6 */ 521b5a892a1SMatthew G. Knepley 1, -1, 3, -3, 0, -3, 2, -2, /* -5: (1243) p10 */ 522b5a892a1SMatthew G. Knepley 1, -3, 2, -1, 3, -1, 0, -3, /* -4: (1432) p9 */ 523b5a892a1SMatthew G. Knepley 0, -3, 1, -1, 3, -3, 2, -3, /* -3: (12) p1 */ 524b5a892a1SMatthew G. Knepley 0, -2, 2, -2, 1, -2, 3, -3, /* -2: (23) p2 */ 525b5a892a1SMatthew G. Knepley 0, -1, 3, -2, 2, -3, 1, -2, /* -1: (13) p5 */ 526b5a892a1SMatthew G. Knepley 0, 0, 1, 0, 2, 0, 3, 0, /* 0: () p0 */ 527b5a892a1SMatthew G. Knepley 0, 1, 3, 1, 1, 2, 2, 0, /* 1: (123) p4 */ 528b5a892a1SMatthew G. Knepley 0, 2, 2, 1, 3, 0, 1, 2, /* 2: (132) p3 */ 529b5a892a1SMatthew G. Knepley 1, 2, 0, 1, 3, 1, 2, 2, /* 3: (12)(34) p7 */ 530b5a892a1SMatthew G. Knepley 1, 0, 2, 0, 0, 0, 3, 1, /* 4: (243) p8 */ 531b5a892a1SMatthew G. Knepley 1, 1, 3, 2, 2, 2, 0, 0, /* 5: (143) p11 */ 532b5a892a1SMatthew G. Knepley 2, 1, 3, 0, 0, 2, 1, 0, /* 6: (13)(24) p16 */ 533b5a892a1SMatthew G. Knepley 2, 2, 1, 1, 3, 2, 0, 2, /* 7: (142) p15 */ 534b5a892a1SMatthew G. Knepley 2, 0, 0, 0, 1, 0, 3, 2, /* 8: (234) p12 */ 535b5a892a1SMatthew G. Knepley 3, 2, 2, 2, 1, 1, 0, 1, /* 9: (14)(23) p23 */ 536b5a892a1SMatthew G. Knepley 3, 0, 0, 2, 2, 1, 1, 1, /* 10: (134) p19 */ 537b5a892a1SMatthew G. Knepley 3, 1, 1, 2, 0, 1, 2, 1 /* 11: (124) p20 */}; 538b5a892a1SMatthew G. Knepley /* Each rotation determines a permutation of the four diagonals, and this defines the isomorphism with S_4 */ 539ef8b56bfSJed Brown static const PetscInt hexArr[48*6*2] = { 540b5a892a1SMatthew G. Knepley 2, -3, 3, -2, 4, -2, 5, -3, 1, -3, 0, -1, /* -24: reflect bottom and use -3 on top */ 541b5a892a1SMatthew G. Knepley 4, -2, 5, -2, 0, -1, 1, -4, 3, -2, 2, -3, /* -23: reflect bottom and use -3 on top */ 542b5a892a1SMatthew G. Knepley 5, -3, 4, -1, 1, -2, 0, -3, 3, -4, 2, -1, /* -22: reflect bottom and use -3 on top */ 543b5a892a1SMatthew G. Knepley 3, -1, 2, -4, 4, -4, 5, -1, 0, -4, 1, -4, /* -21: reflect bottom and use -3 on top */ 544b5a892a1SMatthew G. Knepley 3, -3, 2, -2, 5, -1, 4, -4, 1, -1, 0, -3, /* -20: reflect bottom and use -3 on top */ 545b5a892a1SMatthew G. Knepley 4, -4, 5, -4, 1, -4, 0, -1, 2, -4, 3, -1, /* -19: reflect bottom and use -3 on top */ 546b5a892a1SMatthew G. Knepley 2, -1, 3, -4, 5, -3, 4, -2, 0, -2, 1, -2, /* -18: reflect bottom and use -3 on top */ 547b5a892a1SMatthew G. Knepley 5, -1, 4, -3, 0, -3, 1, -2, 2, -2, 3, -3, /* -17: reflect bottom and use -3 on top */ 548b5a892a1SMatthew G. Knepley 4, -3, 5, -1, 3, -2, 2, -4, 1, -4, 0, -4, /* -16: reflect bottom and use -3 on top */ 549b5a892a1SMatthew G. Knepley 5, -4, 4, -4, 3, -4, 2, -2, 0, -3, 1, -1, /* -15: reflect bottom and use -3 on top */ 550b5a892a1SMatthew G. Knepley 3, -4, 2, -1, 1, -1, 0, -4, 4, -4, 5, -4, /* -14: reflect bottom and use -3 on top */ 551b5a892a1SMatthew G. Knepley 2, -2, 3, -3, 0, -2, 1, -3, 4, -2, 5, -2, /* -13: reflect bottom and use -3 on top */ 552b5a892a1SMatthew G. Knepley 1, -3, 0, -1, 4, -1, 5, -4, 3, -1, 2, -4, /* -12: reflect bottom and use -3 on top */ 553b5a892a1SMatthew G. Knepley 1, -1, 0, -3, 5, -4, 4, -1, 2, -1, 3, -4, /* -11: reflect bottom and use -3 on top */ 554b5a892a1SMatthew G. Knepley 5, -2, 4, -2, 2, -2, 3, -4, 1, -2, 0, -2, /* -10: reflect bottom and use -3 on top */ 555b5a892a1SMatthew G. Knepley 1, -2, 0, -2, 2, -1, 3, -1, 4, -1, 5, -3, /* -9: reflect bottom and use -3 on top */ 556b5a892a1SMatthew G. Knepley 4, -1, 5, -3, 2, -4, 3, -2, 0, -1, 1, -3, /* -8: reflect bottom and use -3 on top */ 557b5a892a1SMatthew G. Knepley 3, -2, 2, -3, 0, -4, 1, -1, 5, -1, 4, -3, /* -7: reflect bottom and use -3 on top */ 558b5a892a1SMatthew G. Knepley 1, -4, 0, -4, 3, -1, 2, -1, 5, -4, 4, -4, /* -6: reflect bottom and use -3 on top */ 559b5a892a1SMatthew G. Knepley 2, -4, 3, -1, 1, -3, 0, -2, 5, -3, 4, -1, /* -5: reflect bottom and use -3 on top */ 560b5a892a1SMatthew G. Knepley 0, -4, 1, -4, 4, -3, 5, -2, 2, -3, 3, -2, /* -4: reflect bottom and use -3 on top */ 561b5a892a1SMatthew G. Knepley 0, -3, 1, -1, 3, -3, 2, -3, 4, -3, 5, -1, /* -3: reflect bottom and use -3 on top */ 562b5a892a1SMatthew G. Knepley 0, -2, 1, -2, 5, -2, 4, -3, 3, -3, 2, -2, /* -2: reflect bottom and use -3 on top */ 563b5a892a1SMatthew G. Knepley 0, -1, 1, -3, 2, -3, 3, -3, 5, -2, 4, -2, /* -1: reflect bottom and use -3 on top */ 564b5a892a1SMatthew G. Knepley 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, /* 0: identity */ 565b5a892a1SMatthew G. Knepley 0, 1, 1, 3, 5, 3, 4, 0, 2, 0, 3, 1, /* 1: 90 rotation about z */ 566b5a892a1SMatthew G. Knepley 0, 2, 1, 2, 3, 0, 2, 0, 5, 3, 4, 1, /* 2: 180 rotation about z */ 567b5a892a1SMatthew G. Knepley 0, 3, 1, 1, 4, 0, 5, 3, 3, 0, 2, 1, /* 3: 270 rotation about z */ 568b5a892a1SMatthew G. Knepley 2, 3, 3, 2, 1, 0, 0, 3, 4, 3, 5, 1, /* 4: 90 rotation about x */ 569b5a892a1SMatthew G. Knepley 1, 3, 0, 1, 3, 2, 2, 2, 4, 2, 5, 2, /* 5: 180 rotation about x */ 570b5a892a1SMatthew G. Knepley 3, 1, 2, 0, 0, 1, 1, 2, 4, 1, 5, 3, /* 6: 270 rotation about x */ 571b5a892a1SMatthew G. Knepley 4, 0, 5, 0, 2, 1, 3, 3, 1, 1, 0, 3, /* 7: 90 rotation about y */ 572b5a892a1SMatthew G. Knepley 1, 1, 0, 3, 2, 2, 3, 2, 5, 1, 4, 3, /* 8: 180 rotation about y */ 573b5a892a1SMatthew G. Knepley 5, 1, 4, 3, 2, 3, 3, 1, 0, 0, 1, 0, /* 9: 270 rotation about y */ 574b5a892a1SMatthew G. Knepley 1, 0, 0, 0, 5, 1, 4, 2, 3, 2, 2, 3, /* 10: 180 rotation about x+y */ 575b5a892a1SMatthew G. Knepley 1, 2, 0, 2, 4, 2, 5, 1, 2, 2, 3, 3, /* 11: 180 rotation about x-y */ 576b5a892a1SMatthew G. Knepley 2, 1, 3, 0, 0, 3, 1, 0, 5, 0, 4, 0, /* 12: 180 rotation about y+z */ 577b5a892a1SMatthew G. Knepley 3, 3, 2, 2, 1, 2, 0, 1, 5, 2, 4, 2, /* 13: 180 rotation about y-z */ 578b5a892a1SMatthew G. Knepley 5, 3, 4, 1, 3, 1, 2, 3, 1, 3, 0, 1, /* 14: 180 rotation about z+x */ 579b5a892a1SMatthew G. Knepley 4, 2, 5, 2, 3, 3, 2, 1, 0, 2, 1, 2, /* 15: 180 rotation about z-x */ 580b5a892a1SMatthew G. Knepley 5, 0, 4, 0, 0, 0, 1, 3, 3, 1, 2, 0, /* 16: 120 rotation about x+y+z (v0v6) */ 581b5a892a1SMatthew G. Knepley 2, 0, 3, 1, 5, 0, 4, 3, 1, 0, 0, 0, /* 17: 240 rotation about x+y+z (v0v6) */ 582b5a892a1SMatthew G. Knepley 4, 3, 5, 1, 1, 1, 0, 2, 3, 3, 2, 2, /* 18: 120 rotation about x+y-z (v4v2) */ 583b5a892a1SMatthew G. Knepley 3, 2, 2, 3, 5, 2, 4, 1, 0, 1, 1, 3, /* 19: 240 rotation about x+y-z (v4v2) */ 584b5a892a1SMatthew G. Knepley 3, 0, 2, 1, 4, 1, 5, 2, 1, 2, 0, 2, /* 20: 120 rotation about x-y+z (v1v5) */ 585b5a892a1SMatthew G. Knepley 5, 2, 4, 2, 1, 3, 0, 0, 2, 3, 3, 2, /* 21: 240 rotation about x-y+z (v1v5) */ 586b5a892a1SMatthew G. Knepley 4, 1, 5, 3, 0, 2, 1, 1, 2, 1, 3, 0, /* 22: 120 rotation about x-y-z (v7v3) */ 587b5a892a1SMatthew G. Knepley 2, 2, 3, 3, 4, 3, 5, 0, 0, 3, 1, 1, /* 23: 240 rotation about x-y-z (v7v3) */ 588b5a892a1SMatthew G. Knepley }; 589ef8b56bfSJed Brown static const PetscInt tripArr[12*5*2] = { 590b5a892a1SMatthew G. Knepley 1, -3, 0, -1, 3, -1, 4, -1, 2, -1, /* -6: reflect bottom and top */ 591b5a892a1SMatthew G. Knepley 1, -1, 0, -3, 4, -1, 2, -1, 3, -1, /* -5: reflect bottom and top */ 592b5a892a1SMatthew G. Knepley 1, -2, 0, -2, 2, -1, 3, -1, 4, -1, /* -4: reflect bottom and top */ 593b5a892a1SMatthew G. Knepley 0, -3, 1, -1, 3, -3, 2, -3, 4, -3, /* -3: reflect bottom and top */ 594b5a892a1SMatthew G. Knepley 0, -2, 1, -2, 4, -3, 3, -3, 2, -3, /* -2: reflect bottom and top */ 595b5a892a1SMatthew G. Knepley 0, -1, 1, -3, 2, -3, 4, -3, 3, -3, /* -1: reflect bottom and top */ 596b5a892a1SMatthew G. Knepley 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, /* 0: identity */ 597b5a892a1SMatthew G. Knepley 0, 1, 1, 2, 4, 0, 2, 0, 3, 0, /* 1: 120 rotation about z */ 598b5a892a1SMatthew G. Knepley 0, 2, 1, 1, 3, 0, 4, 0, 2, 0, /* 2: 240 rotation about z */ 599b5a892a1SMatthew G. Knepley 1, 1, 0, 2, 2, 2, 4, 2, 3, 2, /* 3: 180 rotation about y of 0 */ 600b5a892a1SMatthew G. Knepley 1, 0, 0, 0, 4, 2, 3, 2, 2, 2, /* 4: 180 rotation about y of 1 */ 601b5a892a1SMatthew G. Knepley 1, 2, 0, 1, 3, 2, 2, 2, 4, 2, /* 5: 180 rotation about y of 2 */ 602b5a892a1SMatthew G. Knepley }; 603b5a892a1SMatthew G. Knepley /* a: rotate 120 about z 604b5a892a1SMatthew G. Knepley b: swap top and bottom segments 605b5a892a1SMatthew G. Knepley r: reflect */ 606ef8b56bfSJed Brown static const PetscInt ttriArr[12*5*2] = { 607b5a892a1SMatthew G. Knepley 1, -3, 0, -3, 2, -2, 4, -2, 3, -2, /* -6: r b a^2 */ 608b5a892a1SMatthew G. Knepley 1, -2, 0, -2, 4, -2, 3, -2, 2, -2, /* -5: r b a */ 609b5a892a1SMatthew G. Knepley 1, -1, 0, -1, 3, -2, 2, -2, 4, -2, /* -4: r b */ 610b5a892a1SMatthew G. Knepley 0, -3, 1, -3, 2, -1, 4, -1, 3, -1, /* -3: r a^2 */ 611b5a892a1SMatthew G. Knepley 0, -2, 1, -2, 4, -1, 3, -1, 2, -1, /* -2: r a */ 612b5a892a1SMatthew G. Knepley 0, -1, 1, -1, 3, -1, 2, -1, 4, -1, /* -1: r */ 613b5a892a1SMatthew G. Knepley 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, /* 0: identity */ 614b5a892a1SMatthew G. Knepley 0, 1, 1, 1, 3, 0, 4, 0, 2, 0, /* 1: a */ 615b5a892a1SMatthew G. Knepley 0, 2, 1, 2, 4, 0, 2, 0, 3, 0, /* 2: a^2 */ 616b5a892a1SMatthew G. Knepley 1, 0, 0, 0, 2, 1, 3, 1, 4, 1, /* 3: b */ 617b5a892a1SMatthew G. Knepley 1, 1, 0, 1, 3, 1, 4, 1, 2, 1, /* 4: b a */ 618b5a892a1SMatthew G. Knepley 1, 2, 0, 2, 4, 1, 2, 1, 3, 1, /* 5: b a^2 */ 619b5a892a1SMatthew G. Knepley }; 620b5a892a1SMatthew G. Knepley /* a: rotate 90 about z 621b5a892a1SMatthew G. Knepley b: swap top and bottom segments 622b5a892a1SMatthew G. Knepley r: reflect */ 623ef8b56bfSJed Brown static const PetscInt tquadArr[16*6*2] = { 624b5a892a1SMatthew G. Knepley 1, -4, 0, -4, 3, -2, 2, -2, 5, -2, 4, -2, /* -8: r b a^3 */ 625b5a892a1SMatthew G. Knepley 1, -3, 0, -3, 2, -2, 5, -2, 4, -2, 3, -2, /* -7: r b a^2 */ 626b5a892a1SMatthew G. Knepley 1, -2, 0, -2, 5, -2, 4, -2, 3, -2, 2, -2, /* -6: r b a */ 627b5a892a1SMatthew G. Knepley 1, -1, 0, -1, 4, -2, 3, -2, 2, -2, 5, -2, /* -5: r b */ 628b5a892a1SMatthew G. Knepley 0, -4, 1, -4, 3, -1, 2, -1, 5, -1, 4, -1, /* -4: r a^3 */ 629b5a892a1SMatthew G. Knepley 0, -3, 1, -3, 2, -1, 5, -1, 4, -1, 3, -1, /* -3: r a^2 */ 630b5a892a1SMatthew G. Knepley 0, -2, 1, -2, 5, -1, 4, -1, 3, -1, 2, -1, /* -2: r a */ 631b5a892a1SMatthew G. Knepley 0, -1, 1, -1, 4, -1, 3, -1, 2, -1, 5, -1, /* -1: r */ 632b5a892a1SMatthew G. Knepley 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, /* 0: identity */ 633b5a892a1SMatthew G. Knepley 0, 1, 1, 1, 3, 0, 4, 0, 5, 0, 2, 0, /* 1: a */ 634b5a892a1SMatthew G. Knepley 0, 2, 1, 2, 4, 0, 5, 0, 2, 0, 3, 0, /* 2: a^2 */ 635b5a892a1SMatthew G. Knepley 0, 3, 1, 3, 5, 0, 2, 0, 3, 0, 4, 0, /* 3: a^3 */ 636b5a892a1SMatthew G. Knepley 1, 0, 0, 0, 2, 1, 3, 1, 4, 1, 5, 1, /* 4: b */ 637b5a892a1SMatthew G. Knepley 1, 1, 0, 1, 3, 1, 4, 1, 5, 1, 2, 1, /* 5: b a */ 638b5a892a1SMatthew G. Knepley 1, 2, 0, 2, 4, 1, 5, 1, 2, 1, 3, 1, /* 6: b a^2 */ 639b5a892a1SMatthew G. Knepley 1, 3, 0, 3, 5, 1, 2, 1, 3, 1, 4, 1, /* 7: b a^3 */ 640b5a892a1SMatthew G. Knepley }; 641ef8b56bfSJed Brown static const PetscInt pyrArr[8*5*2] = { 642b5a892a1SMatthew G. Knepley 0, -4, 2, -3, 1, -3, 4, -3, 3, -3, /* -4: Reflect bottom face */ 643b5a892a1SMatthew G. Knepley 0, -3, 3, -3, 2, -3, 1, -3, 4, -3, /* -3: Reflect bottom face */ 644b5a892a1SMatthew G. Knepley 0, -2, 4, -3, 3, -3, 2, -3, 1, -3, /* -2: Reflect bottom face */ 645b5a892a1SMatthew G. Knepley 0, -1, 1, -3, 4, -3, 3, -3, 2, -3, /* -1: Reflect bottom face */ 646b5a892a1SMatthew G. Knepley 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, /* 0: identity */ 647b5a892a1SMatthew G. Knepley 0, 1, 4, 0, 1, 0, 2, 0, 3, 0, /* 1: 90 rotation about z */ 648b5a892a1SMatthew G. Knepley 0, 2, 3, 0, 4, 0, 1, 0, 2, 0, /* 2: 180 rotation about z */ 649b5a892a1SMatthew G. Knepley 0, 3, 2, 0, 3, 0, 4, 0, 1, 0, /* 3: 270 rotation about z */ 650b5a892a1SMatthew G. Knepley }; 651b5a892a1SMatthew G. Knepley switch (ct) { 652b5a892a1SMatthew G. Knepley case DM_POLYTOPE_POINT: return pntArr; 653b5a892a1SMatthew G. Knepley case DM_POLYTOPE_SEGMENT: return &segArr[(o+1)*2*2]; 654b5a892a1SMatthew G. Knepley case DM_POLYTOPE_POINT_PRISM_TENSOR: return &segArr[(o+1)*2*2]; 655b5a892a1SMatthew G. Knepley case DM_POLYTOPE_TRIANGLE: return &triArr[(o+3)*3*2]; 656b5a892a1SMatthew G. Knepley case DM_POLYTOPE_QUADRILATERAL: return &quadArr[(o+4)*4*2]; 657b5a892a1SMatthew G. Knepley case DM_POLYTOPE_SEG_PRISM_TENSOR: return &tsegArr[(o+2)*4*2]; 658b5a892a1SMatthew G. Knepley case DM_POLYTOPE_TETRAHEDRON: return &tetArr[(o+12)*4*2]; 659b5a892a1SMatthew G. Knepley case DM_POLYTOPE_HEXAHEDRON: return &hexArr[(o+24)*6*2]; 660b5a892a1SMatthew G. Knepley case DM_POLYTOPE_TRI_PRISM: return &tripArr[(o+6)*5*2]; 661b5a892a1SMatthew G. Knepley case DM_POLYTOPE_TRI_PRISM_TENSOR: return &ttriArr[(o+6)*5*2]; 662b5a892a1SMatthew G. Knepley case DM_POLYTOPE_QUAD_PRISM_TENSOR: return &tquadArr[(o+8)*6*2]; 663b5a892a1SMatthew G. Knepley case DM_POLYTOPE_PYRAMID: return &pyrArr[(o+4)*5*2]; 664b5a892a1SMatthew G. Knepley default: return NULL; 665b5a892a1SMatthew G. Knepley } 666b5a892a1SMatthew G. Knepley } 667b5a892a1SMatthew G. Knepley 668b5a892a1SMatthew G. Knepley /* A vertex arrangment is a vertex order */ 6699fbee547SJacob Faibussowitsch static inline const PetscInt *DMPolytopeTypeGetVertexArrangment(DMPolytopeType ct, PetscInt o) 670b5a892a1SMatthew G. Knepley { 671ef8b56bfSJed Brown static const PetscInt pntVerts[1] = {0}; 672ef8b56bfSJed Brown static const PetscInt segVerts[2*2] = { 673b5a892a1SMatthew G. Knepley 1, 0, 674b5a892a1SMatthew G. Knepley 0, 1}; 675ef8b56bfSJed Brown static const PetscInt triVerts[6*3] = { 676b5a892a1SMatthew G. Knepley 1, 0, 2, 677b5a892a1SMatthew G. Knepley 0, 2, 1, 678b5a892a1SMatthew G. Knepley 2, 1, 0, 679b5a892a1SMatthew G. Knepley 0, 1, 2, 680b5a892a1SMatthew G. Knepley 1, 2, 0, 681b5a892a1SMatthew G. Knepley 2, 0, 1}; 682ef8b56bfSJed Brown static const PetscInt quadVerts[8*4] = { 683b5a892a1SMatthew G. Knepley 2, 1, 0, 3, 684b5a892a1SMatthew G. Knepley 1, 0, 3, 2, 685b5a892a1SMatthew G. Knepley 0, 3, 2, 1, 686b5a892a1SMatthew G. Knepley 3, 2, 1, 0, 687b5a892a1SMatthew G. Knepley 0, 1, 2, 3, 688b5a892a1SMatthew G. Knepley 1, 2, 3, 0, 689b5a892a1SMatthew G. Knepley 2, 3, 0, 1, 690b5a892a1SMatthew G. Knepley 3, 0, 1, 2}; 691ef8b56bfSJed Brown static const PetscInt tsegVerts[4*4] = { 692b5a892a1SMatthew G. Knepley 3, 2, 1, 0, 693b5a892a1SMatthew G. Knepley 1, 0, 3, 2, 694b5a892a1SMatthew G. Knepley 0, 1, 2, 3, 695b5a892a1SMatthew G. Knepley 2, 3, 0, 1}; 696ef8b56bfSJed Brown static const PetscInt tetVerts[24*4] = { 697b5a892a1SMatthew G. Knepley 2, 3, 1, 0, /* -12: (1324) p22 */ 698b5a892a1SMatthew G. Knepley 3, 1, 2, 0, /* -11: (14) p21 */ 699b5a892a1SMatthew G. Knepley 1, 2, 3, 0, /* -10: (1234) p18 */ 700b5a892a1SMatthew G. Knepley 3, 2, 0, 1, /* -9: (1423) p17 */ 701b5a892a1SMatthew G. Knepley 2, 0, 3, 1, /* -8: (1342) p13 */ 702b5a892a1SMatthew G. Knepley 0, 3, 2, 1, /* -7: (24) p14 */ 703b5a892a1SMatthew G. Knepley 0, 1, 3, 2, /* -6: (34) p6 */ 704b5a892a1SMatthew G. Knepley 1, 3, 0, 2, /* -5: (1243) p10 */ 705b5a892a1SMatthew G. Knepley 3, 0, 1, 2, /* -4: (1432 p9 */ 706b5a892a1SMatthew G. Knepley 1, 0, 2, 3, /* -3: (12) p1 */ 707b5a892a1SMatthew G. Knepley 0, 2, 1, 3, /* -2: (23) p2 */ 708b5a892a1SMatthew G. Knepley 2, 1, 0, 3, /* -1: (13) p5 */ 709b5a892a1SMatthew G. Knepley 0, 1, 2, 3, /* 0: () p0 */ 710b5a892a1SMatthew G. Knepley 1, 2, 0, 3, /* 1: (123) p4 */ 711b5a892a1SMatthew G. Knepley 2, 0, 1, 3, /* 2: (132) p3 */ 712b5a892a1SMatthew G. Knepley 1, 0, 3, 2, /* 3: (12)(34) p7 */ 713b5a892a1SMatthew G. Knepley 0, 3, 1, 2, /* 4: (243) p8 */ 714b5a892a1SMatthew G. Knepley 3, 1, 0, 2, /* 5: (143) p11 */ 715b5a892a1SMatthew G. Knepley 2, 3, 0, 1, /* 6: (13)(24) p16 */ 716b5a892a1SMatthew G. Knepley 3, 0, 2, 1, /* 7: (142) p15 */ 717b5a892a1SMatthew G. Knepley 0, 2, 3, 1, /* 8: (234) p12 */ 718b5a892a1SMatthew G. Knepley 3, 2, 1, 0, /* 9: (14)(23) p23 */ 719b5a892a1SMatthew G. Knepley 2, 1, 3, 0, /* 10: (134) p19 */ 720b5a892a1SMatthew G. Knepley 1, 3, 2, 0 /* 11: (124) p20 */}; 721ef8b56bfSJed Brown static const PetscInt hexVerts[48*8] = { 722b5a892a1SMatthew G. Knepley 3, 0, 4, 5, 2, 6, 7, 1, /* -24: reflected 23 */ 723b5a892a1SMatthew G. Knepley 3, 5, 6, 2, 0, 1, 7, 4, /* -23: reflected 22 */ 724b5a892a1SMatthew G. Knepley 4, 0, 1, 7, 5, 6, 2, 3, /* -22: reflected 21 */ 725b5a892a1SMatthew G. Knepley 6, 7, 1, 2, 5, 3, 0, 4, /* -21: reflected 20 */ 726b5a892a1SMatthew G. Knepley 1, 2, 6, 7, 0, 4, 5, 3, /* -20: reflected 19 */ 727b5a892a1SMatthew G. Knepley 6, 2, 3, 5, 7, 4, 0, 1, /* -19: reflected 18 */ 728b5a892a1SMatthew G. Knepley 4, 5, 3, 0, 7, 1, 2, 6, /* -18: reflected 17 */ 729b5a892a1SMatthew G. Knepley 1, 7, 4, 0, 2, 3, 5, 6, /* -17: reflected 16 */ 730b5a892a1SMatthew G. Knepley 2, 3, 5, 6, 1, 7, 4, 0, /* -16: reflected 15 */ 731b5a892a1SMatthew G. Knepley 7, 4, 0, 1, 6, 2, 3, 5, /* -15: reflected 14 */ 732b5a892a1SMatthew G. Knepley 7, 1, 2, 6, 4, 5, 3, 0, /* -14: reflected 13 */ 733b5a892a1SMatthew G. Knepley 0, 4, 5, 3, 1, 2, 6, 7, /* -13: reflected 12 */ 734b5a892a1SMatthew G. Knepley 5, 4, 7, 6, 3, 2, 1, 0, /* -12: reflected 11 */ 735b5a892a1SMatthew G. Knepley 7, 6, 5, 4, 1, 0, 3, 2, /* -11: reflected 10 */ 736b5a892a1SMatthew G. Knepley 0, 1, 7, 4, 3, 5, 6, 2, /* -10: reflected 9 */ 737b5a892a1SMatthew G. Knepley 4, 7, 6, 5, 0, 3, 2, 1, /* -9: reflected 8 */ 738b5a892a1SMatthew G. Knepley 5, 6, 2, 3, 4, 0, 1, 7, /* -8: reflected 7 */ 739b5a892a1SMatthew G. Knepley 2, 6, 7, 1, 3, 0, 4, 5, /* -7: reflected 6 */ 740b5a892a1SMatthew G. Knepley 6, 5, 4, 7, 2, 1, 0, 3, /* -6: reflected 5 */ 741b5a892a1SMatthew G. Knepley 5, 3, 0, 4, 6, 7, 1, 2, /* -5: reflected 4 */ 742b5a892a1SMatthew G. Knepley 2, 1, 0, 3, 6, 5, 4, 7, /* -4: reflected 3 */ 743b5a892a1SMatthew G. Knepley 1, 0, 3, 2, 7, 6, 5, 4, /* -3: reflected 2 */ 744b5a892a1SMatthew G. Knepley 0, 3, 2, 1, 4, 7, 6, 5, /* -2: reflected 1 */ 745b5a892a1SMatthew G. Knepley 3, 2, 1, 0, 5, 4, 7, 6, /* -1: reflected 0 */ 746b5a892a1SMatthew G. Knepley 0, 1, 2, 3, 4, 5, 6, 7, /* 0: identity */ 747b5a892a1SMatthew G. Knepley 1, 2, 3, 0, 7, 4, 5, 6, /* 1: 90 rotation about z */ 748b5a892a1SMatthew G. Knepley 2, 3, 0, 1, 6, 7, 4, 5, /* 2: 180 rotation about z */ 749b5a892a1SMatthew G. Knepley 3, 0, 1, 2, 5, 6, 7, 4, /* 3: 270 rotation about z */ 750b5a892a1SMatthew G. Knepley 4, 0, 3, 5, 7, 6, 2, 1, /* 4: 90 rotation about x */ 751b5a892a1SMatthew G. Knepley 7, 4, 5, 6, 1, 2, 3, 0, /* 5: 180 rotation about x */ 752b5a892a1SMatthew G. Knepley 1, 7, 6, 2, 0, 3, 5, 4, /* 6: 270 rotation about x */ 753b5a892a1SMatthew G. Knepley 3, 2, 6, 5, 0, 4, 7, 1, /* 7: 90 rotation about y */ 754b5a892a1SMatthew G. Knepley 5, 6, 7, 4, 3, 0, 1, 2, /* 8: 180 rotation about y */ 755b5a892a1SMatthew G. Knepley 4, 7, 1, 0, 5, 3, 2, 6, /* 9: 270 rotation about y */ 756b5a892a1SMatthew G. Knepley 4, 5, 6, 7, 0, 1, 2, 3, /* 10: 180 rotation about x+y */ 757b5a892a1SMatthew G. Knepley 6, 7, 4, 5, 2, 3, 0, 1, /* 11: 180 rotation about x-y */ 758b5a892a1SMatthew G. Knepley 3, 5, 4, 0, 2, 1, 7, 6, /* 12: 180 rotation about y+z */ 759b5a892a1SMatthew G. Knepley 6, 2, 1, 7, 5, 4, 0, 3, /* 13: 180 rotation about y-z */ 760b5a892a1SMatthew G. Knepley 1, 0, 4, 7, 2, 6, 5, 3, /* 14: 180 rotation about z+x */ 761b5a892a1SMatthew G. Knepley 6, 5, 3, 2, 7, 1, 0, 4, /* 15: 180 rotation about z-x */ 762b5a892a1SMatthew G. Knepley 0, 4, 7, 1, 3, 2, 6, 5, /* 16: 120 rotation about x+y+z (v0v6) */ 763b5a892a1SMatthew G. Knepley 0, 3, 5, 4, 1, 7, 6, 2, /* 17: 240 rotation about x+y+z (v0v6) */ 764b5a892a1SMatthew G. Knepley 5, 3, 2, 6, 4, 7, 1, 0, /* 18: 120 rotation about x+y-z (v4v2) */ 765b5a892a1SMatthew G. Knepley 7, 6, 2, 1, 4, 0, 3, 5, /* 19: 240 rotation about x+y-z (v4v2) */ 766b5a892a1SMatthew G. Knepley 2, 1, 7, 6, 3, 5, 4, 0, /* 20: 120 rotation about x-y+z (v1v5) */ 767b5a892a1SMatthew G. Knepley 7, 1, 0, 4, 6, 5, 3, 2, /* 21: 240 rotation about x-y+z (v1v5) */ 768b5a892a1SMatthew G. Knepley 2, 6, 5, 3, 1, 0, 4, 7, /* 22: 120 rotation about x-y-z (v7v3) */ 769b5a892a1SMatthew G. Knepley 5, 4, 0, 3, 6, 2, 1, 7, /* 23: 240 rotation about x-y-z (v7v3) */ 770b5a892a1SMatthew G. Knepley }; 771ef8b56bfSJed Brown static const PetscInt tripVerts[12*6] = { 772b5a892a1SMatthew G. Knepley 4, 3, 5, 2, 1, 0, /* -6: reflect bottom and top */ 773b5a892a1SMatthew G. Knepley 5, 4, 3, 1, 0, 2, /* -5: reflect bottom and top */ 774b5a892a1SMatthew G. Knepley 3, 5, 4, 0, 2, 1, /* -4: reflect bottom and top */ 775b5a892a1SMatthew G. Knepley 1, 0, 2, 5, 4, 3, /* -3: reflect bottom and top */ 776b5a892a1SMatthew G. Knepley 0, 2, 1, 3, 5, 4, /* -2: reflect bottom and top */ 777b5a892a1SMatthew G. Knepley 2, 1, 0, 4, 3, 5, /* -1: reflect bottom and top */ 778b5a892a1SMatthew G. Knepley 0, 1, 2, 3, 4, 5, /* 0: identity */ 779b5a892a1SMatthew G. Knepley 1, 2, 0, 5, 3, 4, /* 1: 120 rotation about z */ 780b5a892a1SMatthew G. Knepley 2, 0, 1, 4, 5, 3, /* 2: 240 rotation about z */ 781b5a892a1SMatthew G. Knepley 4, 5, 3, 2, 0, 1, /* 3: 180 rotation about y of 0 */ 782b5a892a1SMatthew G. Knepley 3, 4, 5, 0, 1, 2, /* 4: 180 rotation about y of 1 */ 783b5a892a1SMatthew G. Knepley 5, 3, 4, 1, 2, 0, /* 5: 180 rotation about y of 2 */ 784b5a892a1SMatthew G. Knepley }; 785ef8b56bfSJed Brown static const PetscInt ttriVerts[12*6] = { 786b5a892a1SMatthew G. Knepley 4, 3, 5, 1, 0, 2, /* -6: r b a^2 */ 787b5a892a1SMatthew G. Knepley 3, 5, 4, 0, 2, 1, /* -5: r b a */ 788b5a892a1SMatthew G. Knepley 5, 4, 3, 2, 1, 0, /* -4: r b */ 789b5a892a1SMatthew G. Knepley 1, 0, 2, 4, 3, 5, /* -3: r a^2 */ 790b5a892a1SMatthew G. Knepley 0, 2, 1, 3, 5, 4, /* -2: r a */ 791b5a892a1SMatthew G. Knepley 2, 1, 0, 5, 4, 3, /* -1: r */ 792b5a892a1SMatthew G. Knepley 0, 1, 2, 3, 4, 5, /* 0: identity */ 793b5a892a1SMatthew G. Knepley 1, 2, 0, 4, 5, 3, /* 1: a */ 794b5a892a1SMatthew G. Knepley 2, 0, 1, 5, 3, 4, /* 2: a^2 */ 795b5a892a1SMatthew G. Knepley 3, 4, 5, 0, 1, 2, /* 3: b */ 796b5a892a1SMatthew G. Knepley 4, 5, 3, 1, 2, 0, /* 4: b a */ 797b5a892a1SMatthew G. Knepley 5, 3, 4, 2, 0, 1, /* 5: b a^2 */ 798b5a892a1SMatthew G. Knepley }; 799b5a892a1SMatthew G. Knepley /* a: rotate 90 about z 800b5a892a1SMatthew G. Knepley b: swap top and bottom segments 801b5a892a1SMatthew G. Knepley r: reflect */ 802ef8b56bfSJed Brown static const PetscInt tquadVerts[16*8] = { 803b5a892a1SMatthew G. Knepley 6, 5, 4, 7, 2, 1, 0, 3, /* -8: r b a^3 */ 804b5a892a1SMatthew G. Knepley 5, 4, 7, 6, 1, 0, 3, 2, /* -7: r b a^2 */ 805b5a892a1SMatthew G. Knepley 4, 7, 6, 5, 0, 3, 2, 1, /* -6: r b a */ 806b5a892a1SMatthew G. Knepley 7, 6, 5, 4, 3, 2, 1, 0, /* -5: r b */ 807b5a892a1SMatthew G. Knepley 2, 1, 0, 3, 6, 5, 4, 7, /* -4: r a^3 */ 808b5a892a1SMatthew G. Knepley 1, 0, 3, 2, 5, 4, 7, 6, /* -3: r a^2 */ 809b5a892a1SMatthew G. Knepley 0, 3, 2, 1, 4, 7, 6, 5, /* -2: r a */ 810b5a892a1SMatthew G. Knepley 3, 2, 1, 0, 7, 6, 5, 4, /* -1: r */ 811b5a892a1SMatthew G. Knepley 0, 1, 2, 3, 4, 5, 6, 7, /* 0: identity */ 812b5a892a1SMatthew G. Knepley 1, 2, 3, 0, 5, 6, 7, 4, /* 1: a */ 813b5a892a1SMatthew G. Knepley 2, 3, 0, 1, 6, 7, 4, 5, /* 2: a^2 */ 814b5a892a1SMatthew G. Knepley 3, 0, 1, 2, 7, 4, 5, 6, /* 3: a^3 */ 815b5a892a1SMatthew G. Knepley 4, 5, 6, 7, 0, 1, 2, 3, /* 4: b */ 816b5a892a1SMatthew G. Knepley 5, 6, 7, 4, 1, 2, 3, 0, /* 5: b a */ 817b5a892a1SMatthew G. Knepley 6, 7, 4, 5, 2, 3, 0, 1, /* 6: b a^2 */ 818b5a892a1SMatthew G. Knepley 7, 4, 5, 6, 3, 0, 1, 2, /* 7: b a^3 */ 819b5a892a1SMatthew G. Knepley }; 820ef8b56bfSJed Brown static const PetscInt pyrVerts[8*5] = { 821b5a892a1SMatthew G. Knepley 2, 1, 0, 3, 4, /* -4: Reflect bottom face */ 822b5a892a1SMatthew G. Knepley 1, 0, 3, 2, 4, /* -3: Reflect bottom face */ 823b5a892a1SMatthew G. Knepley 0, 3, 2, 1, 4, /* -2: Reflect bottom face */ 824b5a892a1SMatthew G. Knepley 3, 2, 1, 0, 4, /* -1: Reflect bottom face */ 825b5a892a1SMatthew G. Knepley 0, 1, 2, 3, 4, /* 0: identity */ 826b5a892a1SMatthew G. Knepley 1, 2, 3, 0, 4, /* 1: 90 rotation about z */ 827b5a892a1SMatthew G. Knepley 2, 3, 0, 1, 4, /* 2: 180 rotation about z */ 828b5a892a1SMatthew G. Knepley 3, 0, 1, 2, 4, /* 3: 270 rotation about z */ 829b5a892a1SMatthew G. Knepley }; 830b5a892a1SMatthew G. Knepley switch (ct) { 831b5a892a1SMatthew G. Knepley case DM_POLYTOPE_POINT: return pntVerts; 832b5a892a1SMatthew G. Knepley case DM_POLYTOPE_SEGMENT: return &segVerts[(o+1)*2]; 833b5a892a1SMatthew G. Knepley case DM_POLYTOPE_POINT_PRISM_TENSOR: return &segVerts[(o+1)*2]; 834b5a892a1SMatthew G. Knepley case DM_POLYTOPE_TRIANGLE: return &triVerts[(o+3)*3]; 835b5a892a1SMatthew G. Knepley case DM_POLYTOPE_QUADRILATERAL: return &quadVerts[(o+4)*4]; 836b5a892a1SMatthew G. Knepley case DM_POLYTOPE_SEG_PRISM_TENSOR: return &tsegVerts[(o+2)*4]; 837b5a892a1SMatthew G. Knepley case DM_POLYTOPE_TETRAHEDRON: return &tetVerts[(o+12)*4]; 838b5a892a1SMatthew G. Knepley case DM_POLYTOPE_HEXAHEDRON: return &hexVerts[(o+24)*8]; 839b5a892a1SMatthew G. Knepley case DM_POLYTOPE_TRI_PRISM: return &tripVerts[(o+6)*6]; 840b5a892a1SMatthew G. Knepley case DM_POLYTOPE_TRI_PRISM_TENSOR: return &ttriVerts[(o+6)*6]; 841b5a892a1SMatthew G. Knepley case DM_POLYTOPE_QUAD_PRISM_TENSOR: return &tquadVerts[(o+8)*8]; 842b5a892a1SMatthew G. Knepley case DM_POLYTOPE_PYRAMID: return &pyrVerts[(o+4)*5]; 843b5a892a1SMatthew G. Knepley default: return NULL; 844b5a892a1SMatthew G. Knepley } 845b5a892a1SMatthew G. Knepley } 846b5a892a1SMatthew G. Knepley 847b5a892a1SMatthew G. Knepley /* This is orientation o1 acting on orientation o2 */ 8489fbee547SJacob Faibussowitsch static inline PetscInt DMPolytopeTypeComposeOrientation(DMPolytopeType ct, PetscInt o1, PetscInt o2) 849b5a892a1SMatthew G. Knepley { 850ef8b56bfSJed Brown static const PetscInt segMult[2*2] = { 851b5a892a1SMatthew G. Knepley 0, -1, 852b5a892a1SMatthew G. Knepley -1, 0}; 853ef8b56bfSJed Brown static const PetscInt triMult[6*6] = { 854b5a892a1SMatthew G. Knepley 0, 2, 1, -3, -1, -2, 855b5a892a1SMatthew G. Knepley 1, 0, 2, -2, -3, -1, 856b5a892a1SMatthew G. Knepley 2, 1, 0, -1, -2, -3, 857b5a892a1SMatthew G. Knepley -3, -2, -1, 0, 1, 2, 858b5a892a1SMatthew G. Knepley -2, -1, -3, 1, 2, 0, 859b5a892a1SMatthew G. Knepley -1, -3, -2, 2, 0, 1}; 860ef8b56bfSJed Brown static const PetscInt quadMult[8*8] = { 861b5a892a1SMatthew G. Knepley 0, 3, 2, 1, -4, -1, -2, -3, 862b5a892a1SMatthew G. Knepley 1, 0, 3, 2, -3, -4, -1, -2, 863b5a892a1SMatthew G. Knepley 2, 1, 0, 3, -2, -3, -4, -1, 864b5a892a1SMatthew G. Knepley 3, 2, 1, 0, -1, -2, -3, -4, 865b5a892a1SMatthew G. Knepley -4, -3, -2, -1, 0, 1, 2, 3, 866b5a892a1SMatthew G. Knepley -3, -2, -1, -4, 1, 2, 3, 0, 867b5a892a1SMatthew G. Knepley -2, -1, -4, -3, 2, 3, 0, 1, 868b5a892a1SMatthew G. Knepley -1, -4, -3, -2, 3, 0, 1, 2}; 869ef8b56bfSJed Brown static const PetscInt tsegMult[4*4] = { 870b5a892a1SMatthew G. Knepley 0, 1, -2, -1, 871b5a892a1SMatthew G. Knepley 1, 0, -1, -2, 872b5a892a1SMatthew G. Knepley -2, -1, 0, 1, 873b5a892a1SMatthew G. Knepley -1, -2, 1, 0}; 874ef8b56bfSJed Brown static const PetscInt tetMult[24*24] = { 875b5a892a1SMatthew G. Knepley 3, 2, 7, 0, 5, 10, 9, 8, 1, 6, 11, 4, -12, -7, -5, -9, -10, -2, -6, -1, -11, -3, -4, -8, 876b5a892a1SMatthew G. Knepley 4, 0, 8, 1, 3, 11, 10, 6, 2, 7, 9, 5, -11, -9, -4, -8, -12, -1, -5, -3, -10, -2, -6, -7, 877b5a892a1SMatthew G. Knepley 5, 1, 6, 2, 4, 9, 11, 7, 0, 8, 10, 3, -10, -8, -6, -7, -11, -3, -4, -2, -12, -1, -5, -9, 878b5a892a1SMatthew G. Knepley 0, 8, 4, 3, 11, 1, 6, 2, 10, 9, 5, 7, -9, -4, -11, -12, -1, -8, -3, -10, -5, -6, -7, -2, 879b5a892a1SMatthew G. Knepley 1, 6, 5, 4, 9, 2, 7, 0, 11, 10, 3, 8, -8, -6, -10, -11, -3, -7, -2, -12, -4, -5, -9, -1, 880b5a892a1SMatthew G. Knepley 2, 7, 3, 5, 10, 0, 8, 1, 9, 11, 4, 6, -7, -5, -12, -10, -2, -9, -1, -11, -6, -4, -8, -3, 881b5a892a1SMatthew G. Knepley 6, 5, 1, 9, 2, 4, 0, 11, 7, 3, 8, 10, -6, -10, -8, -3, -7, -11, -12, -4, -2, -9, -1, -5, 882b5a892a1SMatthew G. Knepley 7, 3, 2, 10, 0, 5, 1, 9, 8, 4, 6, 11, -5, -12, -7, -2, -9, -10, -11, -6, -1, -8, -3, -4, 883b5a892a1SMatthew G. Knepley 8, 4, 0, 11, 1, 3, 2, 10, 6, 5, 7, 9, -4, -11, -9, -1, -8, -12, -10, -5, -3, -7, -2, -6, 884b5a892a1SMatthew G. Knepley 9, 11, 10, 6, 8, 7, 3, 5, 4, 0, 2, 1, -3, -1, -2, -6, -4, -5, -9, -7, -8, -12, -10, -11, 885b5a892a1SMatthew G. Knepley 10, 9, 11, 7, 6, 8, 4, 3, 5, 1, 0, 2, -2, -3, -1, -5, -6, -4, -8, -9, -7, -11, -12, -10, 886b5a892a1SMatthew G. Knepley 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, 887b5a892a1SMatthew G. Knepley -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 888b5a892a1SMatthew G. Knepley -11, -10, -12, -8, -7, -9, -5, -4, -6, -2, -1, -3, 1, 2, 0, 4, 5, 3, 7, 8, 6, 10, 11, 9, 889b5a892a1SMatthew G. Knepley -10, -12, -11, -7, -9, -8, -4, -6, -5, -1, -3, -2, 2, 0, 1, 5, 3, 4, 8, 6, 7, 11, 9, 10, 890b5a892a1SMatthew G. Knepley -9, -5, -1, -12, -2, -4, -3, -11, -7, -6, -8, -10, 3, 10, 8, 0, 7, 11, 9, 4, 2, 6, 1, 5, 891b5a892a1SMatthew G. Knepley -8, -4, -3, -11, -1, -6, -2, -10, -9, -5, -7, -12, 4, 11, 6, 1, 8, 9, 10, 5, 0, 7, 2, 3, 892b5a892a1SMatthew G. Knepley -7, -6, -2, -10, -3, -5, -1, -12, -8, -4, -9, -11, 5, 9, 7, 2, 6, 10, 11, 3, 1, 8, 0, 4, 893b5a892a1SMatthew G. Knepley -3, -8, -4, -6, -11, -1, -9, -2, -10, -12, -5, -7, 6, 4, 11, 9, 1, 8, 0, 10, 5, 3, 7, 2, 894b5a892a1SMatthew G. Knepley -2, -7, -6, -5, -10, -3, -8, -1, -12, -11, -4, -9, 7, 5, 9, 10, 2, 6, 1, 11, 3, 4, 8, 0, 895b5a892a1SMatthew G. Knepley -1, -9, -5, -4, -12, -2, -7, -3, -11, -10, -6, -8, 8, 3, 10, 11, 0, 7, 2, 9, 4, 5, 6, 1, 896b5a892a1SMatthew G. Knepley -6, -2, -7, -3, -5, -10, -12, -8, -1, -9, -11, -4, 9, 7, 5, 6, 10, 2, 3, 1, 11, 0, 4, 8, 897b5a892a1SMatthew G. Knepley -5, -1, -9, -2, -4, -12, -11, -7, -3, -8, -10, -6, 10, 8, 3, 7, 11, 0, 4, 2, 9, 1, 5, 6, 898b5a892a1SMatthew G. Knepley -4, -3, -8, -1, -6, -11, -10, -9, -2, -7, -12, -5, 11, 6, 4, 8, 9, 1, 5, 0, 10, 2, 3, 7, 899b5a892a1SMatthew G. Knepley }; 900ef8b56bfSJed Brown static const PetscInt hexMult[48*48] = { 901b5a892a1SMatthew G. Knepley 18, 2, 5, 22, 21, 8, 16, 0, 13, 6, 11, 3, 15, 9, 4, 23, 12, 1, 19, 10, 7, 20, 14, 17, -24, -10, -20, -16, -12, -21, -4, -5, -18, -13, -15, -8, -2, -11, -14, -7, -3, -22, -6, -17, -19, -9, -1, -23, 902b5a892a1SMatthew G. Knepley 8, 20, 19, 2, 5, 23, 0, 17, 11, 1, 15, 7, 13, 4, 10, 18, 3, 14, 21, 9, 12, 22, 6, 16, -23, -13, -17, -7, -8, -19, -16, -12, -22, -2, -14, -5, -10, -15, -11, -4, -20, -9, -21, -3, -6, -18, -24, -1, 903b5a892a1SMatthew G. Knepley 2, 17, 23, 8, 0, 19, 5, 20, 1, 11, 9, 14, 12, 6, 3, 16, 10, 7, 22, 15, 13, 21, 4, 18, -22, -14, -19, -5, -15, -17, -10, -2, -23, -12, -13, -7, -16, -8, -4, -11, -24, -3, -18, -9, -1, -21, -20, -6, 904b5a892a1SMatthew G. Knepley 21, 5, 2, 16, 18, 0, 22, 8, 4, 12, 3, 11, 14, 7, 13, 20, 6, 10, 17, 1, 9, 23, 15, 19, -21, -8, -18, -15, -4, -24, -12, -14, -20, -7, -16, -10, -11, -2, -5, -13, -6, -19, -3, -23, -22, -1, -9, -17, 905b5a892a1SMatthew G. Knepley 16, 8, 0, 21, 22, 2, 18, 5, 12, 4, 1, 10, 9, 15, 6, 19, 13, 11, 23, 3, 14, 17, 7, 20, -20, -16, -24, -10, -2, -18, -11, -7, -21, -14, -8, -15, -12, -4, -13, -5, -9, -23, -1, -19, -17, -3, -6, -22, 906b5a892a1SMatthew G. Knepley 5, 19, 20, 0, 8, 17, 2, 23, 10, 3, 7, 15, 6, 12, 11, 22, 1, 9, 16, 14, 4, 18, 13, 21, -19, -5, -22, -14, -16, -23, -8, -11, -17, -4, -7, -13, -15, -10, -12, -2, -21, -6, -20, -1, -9, -24, -18, -3, 907b5a892a1SMatthew G. Knepley 22, 0, 8, 18, 16, 5, 21, 2, 6, 13, 10, 1, 7, 14, 12, 17, 4, 3, 20, 11, 15, 19, 9, 23, -18, -15, -21, -8, -11, -20, -2, -13, -24, -5, -10, -16, -4, -12, -7, -14, -1, -17, -9, -22, -23, -6, -3, -19, 908b5a892a1SMatthew G. Knepley 0, 23, 17, 5, 2, 20, 8, 19, 3, 10, 14, 9, 4, 13, 1, 21, 11, 15, 18, 7, 6, 16, 12, 22, -17, -7, -23, -13, -10, -22, -15, -4, -19, -11, -5, -14, -8, -16, -2, -12, -18, -1, -24, -6, -3, -20, -21, -9, 909b5a892a1SMatthew G. Knepley 10, 13, 6, 1, 11, 12, 3, 4, 8, 0, 22, 18, 19, 23, 5, 15, 2, 21, 9, 16, 17, 7, 20, 14, -16, -24, -10, -20, -23, -8, -19, -6, -15, -3, -21, -18, -22, -17, -9, -1, -14, -12, -7, -4, -11, -13, -5, -2, 910b5a892a1SMatthew G. Knepley 1, 4, 12, 10, 3, 6, 11, 13, 0, 8, 16, 21, 17, 20, 2, 14, 5, 18, 7, 22, 19, 9, 23, 15, -15, -21, -8, -18, -17, -10, -22, -3, -16, -6, -24, -20, -19, -23, -1, -9, -5, -4, -13, -12, -2, -7, -14, -11, 911b5a892a1SMatthew G. Knepley 14, 10, 3, 9, 7, 1, 15, 11, 17, 23, 0, 5, 16, 22, 20, 6, 19, 8, 12, 2, 21, 4, 18, 13, -14, -19, -5, -22, -3, -13, -9, -20, -7, -21, -23, -17, -6, -1, -24, -18, -12, -16, -2, -8, -10, -4, -11, -15, 912b5a892a1SMatthew G. Knepley 7, 3, 10, 15, 14, 11, 9, 1, 20, 19, 5, 0, 18, 21, 17, 4, 23, 2, 13, 8, 22, 6, 16, 12, -13, -17, -7, -23, -9, -14, -3, -24, -5, -18, -22, -19, -1, -6, -20, -21, -2, -10, -12, -15, -16, -11, -4, -8, 913b5a892a1SMatthew G. Knepley 13, 14, 15, 12, 4, 9, 6, 7, 21, 22, 23, 20, 2, 0, 18, 3, 16, 17, 1, 19, 8, 11, 5, 10, -12, -9, -11, -6, -21, -4, -24, -22, -2, -23, -3, -1, -20, -18, -19, -17, -16, -14, -15, -13, -5, -8, -10, -7, 914b5a892a1SMatthew G. Knepley 6, 9, 7, 4, 12, 14, 13, 15, 16, 18, 17, 19, 0, 2, 22, 1, 21, 23, 3, 20, 5, 10, 8, 11, -11, -6, -12, -9, -20, -2, -18, -17, -4, -19, -1, -3, -21, -24, -23, -22, -8, -7, -10, -5, -13, -16, -15, -14, 915b5a892a1SMatthew G. Knepley 3, 12, 4, 11, 1, 13, 10, 6, 2, 5, 21, 16, 23, 19, 0, 9, 8, 22, 15, 18, 20, 14, 17, 7, -10, -20, -16, -24, -22, -15, -17, -1, -8, -9, -18, -21, -23, -19, -3, -6, -13, -2, -5, -11, -4, -14, -7, -12, 916b5a892a1SMatthew G. Knepley 20, 16, 18, 23, 17, 21, 19, 22, 14, 15, 4, 6, 3, 1, 7, 0, 9, 12, 2, 13, 11, 5, 10, 8, -9, -11, -6, -12, -14, -3, -13, -10, -1, -8, -2, -4, -7, -5, -16, -15, -23, -20, -22, -18, -24, -19, -17, -21, 917b5a892a1SMatthew G. Knepley 11, 6, 13, 3, 10, 4, 1, 12, 5, 2, 18, 22, 20, 17, 8, 7, 0, 16, 14, 21, 23, 15, 19, 9, -8, -18, -15, -21, -19, -16, -23, -9, -10, -1, -20, -24, -17, -22, -6, -3, -7, -11, -14, -2, -12, -5, -13, -4, 918b5a892a1SMatthew G. Knepley 9, 11, 1, 14, 15, 3, 7, 10, 23, 17, 2, 8, 21, 18, 19, 13, 20, 5, 4, 0, 16, 12, 22, 6, -7, -23, -13, -17, -1, -5, -6, -21, -14, -20, -19, -22, -9, -3, -18, -24, -11, -8, -4, -16, -15, -2, -12, -10, 919b5a892a1SMatthew G. Knepley 19, 21, 22, 17, 23, 16, 20, 18, 9, 7, 12, 13, 1, 3, 15, 2, 14, 4, 0, 6, 10, 8, 11, 5, -6, -12, -9, -11, -7, -1, -5, -15, -3, -16, -4, -2, -14, -13, -8, -10, -19, -21, -17, -24, -18, -23, -22, -20, 920b5a892a1SMatthew G. Knepley 15, 1, 11, 7, 9, 10, 14, 3, 19, 20, 8, 2, 22, 16, 23, 12, 17, 0, 6, 5, 18, 13, 21, 4, -5, -22, -14, -19, -6, -7, -1, -18, -13, -24, -17, -23, -3, -9, -21, -20, -4, -15, -11, -10, -8, -12, -2, -16, 921b5a892a1SMatthew G. Knepley 4, 15, 14, 6, 13, 7, 12, 9, 18, 16, 20, 23, 5, 8, 21, 11, 22, 19, 10, 17, 0, 3, 2, 1, -4, -1, -2, -3, -24, -12, -21, -19, -11, -17, -6, -9, -18, -20, -22, -23, -15, -5, -16, -7, -14, -10, -8, -13, 922b5a892a1SMatthew G. Knepley 17, 18, 16, 19, 20, 22, 23, 21, 7, 9, 6, 4, 10, 11, 14, 5, 15, 13, 8, 12, 1, 0, 3, 2, -3, -4, -1, -2, -13, -9, -14, -16, -6, -15, -12, -11, -5, -7, -10, -8, -22, -24, -23, -21, -20, -17, -19, -18, 923b5a892a1SMatthew G. Knepley 12, 7, 9, 13, 6, 15, 4, 14, 22, 21, 19, 17, 8, 5, 16, 10, 18, 20, 11, 23, 2, 1, 0, 3, -2, -3, -4, -1, -18, -11, -20, -23, -12, -22, -9, -6, -24, -21, -17, -19, -10, -13, -8, -14, -7, -15, -16, -5, 924b5a892a1SMatthew G. Knepley 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -19, -20, -21, -22, -23, -24, 925b5a892a1SMatthew G. Knepley -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 926b5a892a1SMatthew G. Knepley -13, -8, -10, -14, -7, -16, -5, -15, -23, -22, -20, -18, -9, -6, -17, -11, -19, -21, -12, -24, -3, -2, -1, -4, 1, 2, 3, 0, 17, 10, 19, 22, 11, 21, 8, 5, 23, 20, 16, 18, 9, 12, 7, 13, 6, 14, 15, 4, 927b5a892a1SMatthew G. Knepley -18, -19, -17, -20, -21, -23, -24, -22, -8, -10, -7, -5, -11, -12, -15, -6, -16, -14, -9, -13, -2, -1, -4, -3, 2, 3, 0, 1, 12, 8, 13, 15, 5, 14, 11, 10, 4, 6, 9, 7, 21, 23, 22, 20, 19, 16, 18, 17, 928b5a892a1SMatthew G. Knepley -5, -16, -15, -7, -14, -8, -13, -10, -19, -17, -21, -24, -6, -9, -22, -12, -23, -20, -11, -18, -1, -4, -3, -2, 3, 0, 1, 2, 23, 11, 20, 18, 10, 16, 5, 8, 17, 19, 21, 22, 14, 4, 15, 6, 13, 9, 7, 12, 929b5a892a1SMatthew G. Knepley -16, -2, -12, -8, -10, -11, -15, -4, -20, -21, -9, -3, -23, -17, -24, -13, -18, -1, -7, -6, -19, -14, -22, -5, 4, 21, 13, 18, 5, 6, 0, 17, 12, 23, 16, 22, 2, 8, 20, 19, 3, 14, 10, 9, 7, 11, 1, 15, 930b5a892a1SMatthew G. Knepley -20, -22, -23, -18, -24, -17, -21, -19, -10, -8, -13, -14, -2, -4, -16, -3, -15, -5, -1, -7, -11, -9, -12, -6, 5, 11, 8, 10, 6, 0, 4, 14, 2, 15, 3, 1, 13, 12, 7, 9, 18, 20, 16, 23, 17, 22, 21, 19, 931b5a892a1SMatthew G. Knepley -10, -12, -2, -15, -16, -4, -8, -11, -24, -18, -3, -9, -22, -19, -20, -14, -21, -6, -5, -1, -17, -13, -23, -7, 6, 22, 12, 16, 0, 4, 5, 20, 13, 19, 18, 21, 8, 2, 17, 23, 10, 7, 3, 15, 14, 1, 11, 9, 932b5a892a1SMatthew G. Knepley -12, -7, -14, -4, -11, -5, -2, -13, -6, -3, -19, -23, -21, -18, -9, -8, -1, -17, -15, -22, -24, -16, -20, -10, 7, 17, 14, 20, 18, 15, 22, 8, 9, 0, 19, 23, 16, 21, 5, 2, 6, 10, 13, 1, 11, 4, 12, 3, 933b5a892a1SMatthew G. Knepley -21, -17, -19, -24, -18, -22, -20, -23, -15, -16, -5, -7, -4, -2, -8, -1, -10, -13, -3, -14, -12, -6, -11, -9, 8, 10, 5, 11, 13, 2, 12, 9, 0, 7, 1, 3, 6, 4, 15, 14, 22, 19, 21, 17, 23, 18, 16, 20, 934b5a892a1SMatthew G. Knepley -4, -13, -5, -12, -2, -14, -11, -7, -3, -6, -22, -17, -24, -20, -1, -10, -9, -23, -16, -19, -21, -15, -18, -8, 9, 19, 15, 23, 21, 14, 16, 0, 7, 8, 17, 20, 22, 18, 2, 5, 12, 1, 4, 10, 3, 13, 6, 11, 935b5a892a1SMatthew G. Knepley -7, -10, -8, -5, -13, -15, -14, -16, -17, -19, -18, -20, -1, -3, -23, -2, -22, -24, -4, -21, -6, -11, -9, -12, 10, 5, 11, 8, 19, 1, 17, 16, 3, 18, 0, 2, 20, 23, 22, 21, 7, 6, 9, 4, 12, 15, 14, 13, 936b5a892a1SMatthew G. Knepley -14, -15, -16, -13, -5, -10, -7, -8, -22, -23, -24, -21, -3, -1, -19, -4, -17, -18, -2, -20, -9, -12, -6, -11, 11, 8, 10, 5, 20, 3, 23, 21, 1, 22, 2, 0, 19, 17, 18, 16, 15, 13, 14, 12, 4, 7, 9, 6, 937b5a892a1SMatthew G. Knepley -8, -4, -11, -16, -15, -12, -10, -2, -21, -20, -6, -1, -19, -22, -18, -5, -24, -3, -14, -9, -23, -7, -17, -13, 12, 16, 6, 22, 8, 13, 2, 23, 4, 17, 21, 18, 0, 5, 19, 20, 1, 9, 11, 14, 15, 10, 3, 7, 938b5a892a1SMatthew G. Knepley -15, -11, -4, -10, -8, -2, -16, -12, -18, -24, -1, -6, -17, -23, -21, -7, -20, -9, -13, -3, -22, -5, -19, -14, 13, 18, 4, 21, 2, 12, 8, 19, 6, 20, 22, 16, 5, 0, 23, 17, 11, 15, 1, 7, 9, 3, 10, 14, 939b5a892a1SMatthew G. Knepley -2, -5, -13, -11, -4, -7, -12, -14, -1, -9, -17, -22, -18, -21, -3, -15, -6, -19, -8, -23, -20, -10, -24, -16, 14, 20, 7, 17, 16, 9, 21, 2, 15, 5, 23, 19, 18, 22, 0, 8, 4, 3, 12, 11, 1, 6, 13, 10, 940b5a892a1SMatthew G. Knepley -11, -14, -7, -2, -12, -13, -4, -5, -9, -1, -23, -19, -20, -24, -6, -16, -3, -22, -10, -17, -18, -8, -21, -15, 15, 23, 9, 19, 22, 7, 18, 5, 14, 2, 20, 17, 21, 16, 8, 0, 13, 11, 6, 3, 10, 12, 4, 1, 941b5a892a1SMatthew G. Knepley -1, -24, -18, -6, -3, -21, -9, -20, -4, -11, -15, -10, -5, -14, -2, -22, -12, -16, -19, -8, -7, -17, -13, -23, 16, 6, 22, 12, 9, 21, 14, 3, 18, 10, 4, 13, 7, 15, 1, 11, 17, 0, 23, 5, 2, 19, 20, 8, 942b5a892a1SMatthew G. Knepley -23, -1, -9, -19, -17, -6, -22, -3, -7, -14, -11, -2, -8, -15, -13, -18, -5, -4, -21, -12, -16, -20, -10, -24, 17, 14, 20, 7, 10, 19, 1, 12, 23, 4, 9, 15, 3, 11, 6, 13, 0, 16, 8, 21, 22, 5, 2, 18, 943b5a892a1SMatthew G. Knepley -6, -20, -21, -1, -9, -18, -3, -24, -11, -4, -8, -16, -7, -13, -12, -23, -2, -10, -17, -15, -5, -19, -14, -22, 18, 4, 21, 13, 15, 22, 7, 10, 16, 3, 6, 12, 14, 9, 11, 1, 20, 5, 19, 0, 8, 23, 17, 2, 944b5a892a1SMatthew G. Knepley -17, -9, -1, -22, -23, -3, -19, -6, -13, -5, -2, -11, -10, -16, -7, -20, -14, -12, -24, -4, -15, -18, -8, -21, 19, 15, 23, 9, 1, 17, 10, 6, 20, 13, 7, 14, 11, 3, 12, 4, 8, 22, 0, 18, 16, 2, 5, 21, 945b5a892a1SMatthew G. Knepley -22, -6, -3, -17, -19, -1, -23, -9, -5, -13, -4, -12, -15, -8, -14, -21, -7, -11, -18, -2, -10, -24, -16, -20, 20, 7, 17, 14, 3, 23, 11, 13, 19, 6, 15, 9, 10, 1, 4, 12, 5, 18, 2, 22, 21, 0, 8, 16, 946b5a892a1SMatthew G. Knepley -3, -18, -24, -9, -1, -20, -6, -21, -2, -12, -10, -15, -13, -7, -4, -17, -11, -8, -23, -16, -14, -22, -5, -19, 21, 13, 18, 4, 14, 16, 9, 1, 22, 11, 12, 6, 15, 7, 3, 10, 23, 2, 17, 8, 0, 20, 19, 5, 947b5a892a1SMatthew G. Knepley -9, -21, -20, -3, -6, -24, -1, -18, -12, -2, -16, -8, -14, -5, -11, -19, -4, -15, -22, -10, -13, -23, -7, -17, 22, 12, 16, 6, 7, 18, 15, 11, 21, 1, 13, 4, 9, 14, 10, 3, 19, 8, 20, 2, 5, 17, 23, 0, 948b5a892a1SMatthew G. Knepley -19, -3, -6, -23, -22, -9, -17, -1, -14, -7, -12, -4, -16, -10, -5, -24, -13, -2, -20, -11, -8, -21, -15, -18, 23, 9, 19, 15, 11, 20, 3, 4, 17, 12, 14, 7, 1, 10, 13, 6, 2, 21, 5, 16, 18, 8, 0, 22, 949b5a892a1SMatthew G. Knepley }; 950ef8b56bfSJed Brown static const PetscInt tripMult[12*12] = { 951b5a892a1SMatthew G. Knepley 1, 0, 2, 3, 5, 4, -6, -4, -5, -2, -3, -1, 952b5a892a1SMatthew G. Knepley 0, 2, 1, 4, 3, 5, -5, -6, -4, -3, -1, -2, 953b5a892a1SMatthew G. Knepley 2, 1, 0, 5, 4, 3, -4, -5, -6, -1, -2, -3, 954b5a892a1SMatthew G. Knepley 4, 3, 5, 0, 2, 1, -3, -1, -2, -5, -6, -4, 955b5a892a1SMatthew G. Knepley 3, 5, 4, 1, 0, 2, -2, -3, -1, -6, -4, -5, 956b5a892a1SMatthew G. Knepley 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, 957b5a892a1SMatthew G. Knepley -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 958b5a892a1SMatthew G. Knepley -4, -6, -5, -2, -1, -3, 1, 2, 0, 5, 3, 4, 959b5a892a1SMatthew G. Knepley -5, -4, -6, -1, -3, -2, 2, 0, 1, 4, 5, 3, 960b5a892a1SMatthew G. Knepley -3, -2, -1, -6, -5, -4, 3, 4, 5, 0, 1, 2, 961b5a892a1SMatthew G. Knepley -1, -3, -2, -5, -4, -6, 4, 5, 3, 2, 0, 1, 962b5a892a1SMatthew G. Knepley -2, -1, -3, -4, -6, -5, 5, 3, 4, 1, 2, 0, 963b5a892a1SMatthew G. Knepley }; 964ef8b56bfSJed Brown static const PetscInt ttriMult[12*12] = { 965b5a892a1SMatthew G. Knepley 0, 2, 1, 3, 5, 4, -6, -4, -5, -3, -1, -2, 966b5a892a1SMatthew G. Knepley 1, 0, 2, 4, 3, 5, -5, -6, -4, -2, -3, -1, 967b5a892a1SMatthew G. Knepley 2, 1, 0, 5, 4, 3, -4, -5, -6, -1, -2, -3, 968b5a892a1SMatthew G. Knepley 3, 5, 4, 0, 2, 1, -3, -1, -2, -6, -4, -5, 969b5a892a1SMatthew G. Knepley 4, 3, 5, 1, 0, 2, -2, -3, -1, -5, -6, -4, 970b5a892a1SMatthew G. Knepley 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, 971b5a892a1SMatthew G. Knepley -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 972b5a892a1SMatthew G. Knepley -5, -4, -6, -2, -1, -3, 1, 2, 0, 4, 5, 3, 973b5a892a1SMatthew G. Knepley -4, -6, -5, -1, -3, -2, 2, 0, 1, 5, 3, 4, 974b5a892a1SMatthew G. Knepley -3, -2, -1, -6, -5, -4, 3, 4, 5, 0, 1, 2, 975b5a892a1SMatthew G. Knepley -2, -1, -3, -5, -4, -6, 4, 5, 3, 1, 2, 0, 976b5a892a1SMatthew G. Knepley -1, -3, -2, -4, -6, -5, 5, 3, 4, 2, 0, 1, 977b5a892a1SMatthew G. Knepley }; 978ef8b56bfSJed Brown static const PetscInt tquadMult[16*16] = { 979b5a892a1SMatthew G. Knepley 0, 3, 2, 1, 4, 7, 6, 5, -8, -5, -6, -7, -4, -1, -2, -3, 980b5a892a1SMatthew G. Knepley 1, 0, 3, 2, 5, 4, 7, 6, -7, -8, -5, -6, -3, -4, -1, -2, 981b5a892a1SMatthew G. Knepley 2, 1, 0, 3, 6, 5, 4, 7, -6, -7, -8, -5, -2, -3, -4, -1, 982b5a892a1SMatthew G. Knepley 3, 2, 1, 0, 7, 6, 5, 4, -5, -6, -7, -8, -1, -2, -3, -4, 983b5a892a1SMatthew G. Knepley 4, 7, 6, 5, 0, 3, 2, 1, -4, -1, -2, -3, -8, -5, -6, -7, 984b5a892a1SMatthew G. Knepley 5, 4, 7, 6, 1, 0, 3, 2, -3, -4, -1, -2, -7, -8, -5, -6, 985b5a892a1SMatthew G. Knepley 6, 5, 4, 7, 2, 1, 0, 3, -2, -3, -4, -1, -6, -7, -8, -5, 986b5a892a1SMatthew G. Knepley 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, 987b5a892a1SMatthew G. Knepley -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 988b5a892a1SMatthew G. Knepley -7, -6, -5, -8, -3, -2, -1, -4, 1, 2, 3, 0, 5, 6, 7, 4, 989b5a892a1SMatthew G. Knepley -6, -5, -8, -7, -2, -1, -4, -3, 2, 3, 0, 1, 6, 7, 4, 5, 990b5a892a1SMatthew G. Knepley -5, -8, -7, -6, -1, -4, -3, -2, 3, 0, 1, 2, 7, 4, 5, 6, 991b5a892a1SMatthew G. Knepley -4, -3, -2, -1, -8, -7, -6, -5, 4, 5, 6, 7, 0, 1, 2, 3, 992b5a892a1SMatthew G. Knepley -3, -2, -1, -4, -7, -6, -5, -8, 5, 6, 7, 4, 1, 2, 3, 0, 993b5a892a1SMatthew G. Knepley -2, -1, -4, -3, -6, -5, -8, -7, 6, 7, 4, 5, 2, 3, 0, 1, 994b5a892a1SMatthew G. Knepley -1, -4, -3, -2, -5, -8, -7, -6, 7, 4, 5, 6, 3, 0, 1, 2, 995b5a892a1SMatthew G. Knepley }; 996ef8b56bfSJed Brown static const PetscInt pyrMult[8*8] = { 997b5a892a1SMatthew G. Knepley 0, 3, 2, 1, -4, -1, -2, -3, 998b5a892a1SMatthew G. Knepley 1, 0, 3, 2, -3, -4, -1, -2, 999b5a892a1SMatthew G. Knepley 2, 1, 0, 3, -2, -3, -4, -1, 1000b5a892a1SMatthew G. Knepley 3, 2, 1, 0, -1, -2, -3, -4, 1001b5a892a1SMatthew G. Knepley -4, -3, -2, -1, 0, 1, 2, 3, 1002b5a892a1SMatthew G. Knepley -3, -2, -1, -4, 1, 2, 3, 0, 1003b5a892a1SMatthew G. Knepley -2, -1, -4, -3, 2, 3, 0, 1, 1004b5a892a1SMatthew G. Knepley -1, -4, -3, -2, 3, 0, 1, 2, 1005b5a892a1SMatthew G. Knepley }; 1006b5a892a1SMatthew G. Knepley switch (ct) { 1007b5a892a1SMatthew G. Knepley case DM_POLYTOPE_POINT: return 0; 1008b5a892a1SMatthew G. Knepley case DM_POLYTOPE_SEGMENT: 1009b5a892a1SMatthew G. Knepley case DM_POLYTOPE_POINT_PRISM_TENSOR: return segMult[(o1+1)*2+o2+1]; 1010b5a892a1SMatthew G. Knepley case DM_POLYTOPE_TRIANGLE: return triMult[(o1+3)*6+o2+3]; 1011b5a892a1SMatthew G. Knepley case DM_POLYTOPE_QUADRILATERAL: return quadMult[(o1+4)*8+o2+4]; 1012b5a892a1SMatthew G. Knepley case DM_POLYTOPE_SEG_PRISM_TENSOR: return tsegMult[(o1+2)*4+o2+2]; 1013b5a892a1SMatthew G. Knepley case DM_POLYTOPE_TETRAHEDRON: return tetMult[(o1+12)*24+o2+12]; 1014b5a892a1SMatthew G. Knepley case DM_POLYTOPE_HEXAHEDRON: return hexMult[(o1+24)*48+o2+24]; 1015b5a892a1SMatthew G. Knepley case DM_POLYTOPE_TRI_PRISM: return tripMult[(o1+6)*12+o2+6]; 1016b5a892a1SMatthew G. Knepley case DM_POLYTOPE_TRI_PRISM_TENSOR: return ttriMult[(o1+6)*12+o2+6]; 1017b5a892a1SMatthew G. Knepley case DM_POLYTOPE_QUAD_PRISM_TENSOR: return tquadMult[(o1+8)*16+o2+8]; 1018b5a892a1SMatthew G. Knepley case DM_POLYTOPE_PYRAMID: return pyrMult[(o1+4)*8+o2+4]; 1019b5a892a1SMatthew G. Knepley default: return 0; 1020b5a892a1SMatthew G. Knepley } 1021b5a892a1SMatthew G. Knepley } 1022b5a892a1SMatthew G. Knepley 1023b5a892a1SMatthew G. Knepley /* This is orientation o1 acting on orientation o2^{-1} */ 10249fbee547SJacob Faibussowitsch static inline PetscInt DMPolytopeTypeComposeOrientationInv(DMPolytopeType ct, PetscInt o1, PetscInt o2) 1025b5a892a1SMatthew G. Knepley { 1026ef8b56bfSJed Brown static const PetscInt triInv[6] = {-3, -2, -1, 0, 2, 1}; 1027ef8b56bfSJed Brown static const PetscInt quadInv[8] = {-4, -3, -2, -1, 0, 3, 2, 1}; 1028ef8b56bfSJed Brown static const PetscInt tetInv[24] = {-9, -11, -4, -12, -5, -7, -6, -8, -10, -3, -2, -1, 0, 2, 1, 3, 8, 10, 6, 11, 4, 9, 5, 7}; 1029ef8b56bfSJed Brown static const PetscInt hexInv[48] = {-17, -18, -20, -19, -22, -21, -23, -24, -15, -16, -14, -13, -11, -12, -10, -9, -8, -5, -6, -7, -4, -3, -2, -1, 1030b5a892a1SMatthew G. Knepley 0, 3, 2, 1, 6, 5, 4, 9, 8, 7, 10, 11, 12, 13, 14, 15, 17, 16, 19, 18, 21, 20, 23, 22}; 1031ef8b56bfSJed Brown static const PetscInt tripInv[12] = {-5, -6, -4, -3, -2, -1, 0, 2, 1, 3, 4, 5}; 1032ef8b56bfSJed Brown static const PetscInt ttriInv[12] = {-6, -5, -4, -3, -2, -1, 0, 2, 1, 3, 5, 4}; 1033ef8b56bfSJed Brown static const PetscInt tquadInv[16] = {-8, -7, -6, -5, -4, -3, -2, -1, 0, 3, 2, 1, 4, 7, 6, 5}; 1034ef8b56bfSJed Brown static const PetscInt pyrInv[8] = {-4, -3, -2, -1, 0, 3, 2, 1}; 1035b5a892a1SMatthew G. Knepley switch (ct) { 1036b5a892a1SMatthew G. Knepley case DM_POLYTOPE_POINT: return 0; 1037b5a892a1SMatthew G. Knepley case DM_POLYTOPE_SEGMENT: 1038b5a892a1SMatthew G. Knepley case DM_POLYTOPE_POINT_PRISM_TENSOR: return DMPolytopeTypeComposeOrientation(ct, o1, o2); 1039b5a892a1SMatthew G. Knepley case DM_POLYTOPE_TRIANGLE: return DMPolytopeTypeComposeOrientation(ct, o1, triInv[o2+3]); 1040b5a892a1SMatthew G. Knepley case DM_POLYTOPE_QUADRILATERAL: return DMPolytopeTypeComposeOrientation(ct, o1, quadInv[o2+4]); 1041b5a892a1SMatthew G. Knepley case DM_POLYTOPE_SEG_PRISM_TENSOR: return DMPolytopeTypeComposeOrientation(ct, o1, o2); 1042b5a892a1SMatthew G. Knepley case DM_POLYTOPE_TETRAHEDRON: return DMPolytopeTypeComposeOrientation(ct, o1, tetInv[o2+12]); 1043b5a892a1SMatthew G. Knepley case DM_POLYTOPE_HEXAHEDRON: return DMPolytopeTypeComposeOrientation(ct, o1, hexInv[o2+24]); 1044b5a892a1SMatthew G. Knepley case DM_POLYTOPE_TRI_PRISM: return DMPolytopeTypeComposeOrientation(ct, o1, tripInv[o2+6]); 1045b5a892a1SMatthew G. Knepley case DM_POLYTOPE_TRI_PRISM_TENSOR: return DMPolytopeTypeComposeOrientation(ct, o1, ttriInv[o2+6]); 1046b5a892a1SMatthew G. Knepley case DM_POLYTOPE_QUAD_PRISM_TENSOR: return DMPolytopeTypeComposeOrientation(ct, o1, tquadInv[o2+8]); 1047b5a892a1SMatthew G. Knepley case DM_POLYTOPE_PYRAMID: return DMPolytopeTypeComposeOrientation(ct, o1, pyrInv[o2+4]); 1048b5a892a1SMatthew G. Knepley default: return 0; 1049b5a892a1SMatthew G. Knepley } 1050b5a892a1SMatthew G. Knepley } 1051b5a892a1SMatthew G. Knepley 1052b5a892a1SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMPolytopeMatchOrientation(DMPolytopeType, const PetscInt[], const PetscInt[], PetscInt *, PetscBool *); 1053b5a892a1SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMPolytopeMatchVertexOrientation(DMPolytopeType, const PetscInt[], const PetscInt[], PetscInt *, PetscBool *); 1054b5a892a1SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMPolytopeGetOrientation(DMPolytopeType, const PetscInt[], const PetscInt[], PetscInt *); 1055b5a892a1SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMPolytopeGetVertexOrientation(DMPolytopeType, const PetscInt[], const PetscInt[], PetscInt *); 1056012bc364SMatthew G. Knepley PETSC_EXTERN PetscErrorCode DMPolytopeInCellTest(DMPolytopeType, const PetscReal[], PetscBool *); 1057b5a892a1SMatthew G. Knepley 1058e1589f56SBarry Smith #endif 1059