137045ce4SJed Brown /* 237045ce4SJed Brown Common tools for constructing discretizations 337045ce4SJed Brown */ 4a4963045SJacob Faibussowitsch #pragma once 537045ce4SJed Brown 637045ce4SJed Brown #include <petscsys.h> 74366bac7SMatthew G. Knepley #include <petscdmtypes.h> 84366bac7SMatthew G. Knepley #include <petscistypes.h> 937045ce4SJed Brown 10ce78bad3SBarry Smith /* MANSEC = DM */ 11ac09b921SBarry Smith /* SUBMANSEC = DT */ 12ac09b921SBarry Smith 132cd22861SMatthew G. Knepley PETSC_EXTERN PetscClassId PETSCQUADRATURE_CLASSID; 142cd22861SMatthew G. Knepley 1521454ff5SMatthew G. Knepley /*S 1616a05f60SBarry Smith PetscQuadrature - Quadrature rule for numerical integration. 1721454ff5SMatthew G. Knepley 18329bbf4eSMatthew G. Knepley Level: beginner 1921454ff5SMatthew G. Knepley 20db781477SPatrick Sanan .seealso: `PetscQuadratureCreate()`, `PetscQuadratureDestroy()` 2121454ff5SMatthew G. Knepley S*/ 2221454ff5SMatthew G. Knepley typedef struct _p_PetscQuadrature *PetscQuadrature; 2321454ff5SMatthew G. Knepley 248272889dSSatish Balay /*E 25916e780bShannah_mairs PetscGaussLobattoLegendreCreateType - algorithm used to compute the Gauss-Lobatto-Legendre nodes and weights 268272889dSSatish Balay 2716a05f60SBarry Smith Values: 2816a05f60SBarry Smith + `PETSCGAUSSLOBATTOLEGENDRE_VIA_LINEAR_ALGEBRA` - compute the nodes via linear algebra 2916a05f60SBarry Smith - `PETSCGAUSSLOBATTOLEGENDRE_VIA_NEWTON` - compute the nodes by solving a nonlinear equation with Newton's method 3016a05f60SBarry Smith 318272889dSSatish Balay Level: intermediate 328272889dSSatish Balay 3316a05f60SBarry Smith .seealso: `PetscQuadrature` 348272889dSSatish Balay E*/ 359371c9d4SSatish Balay typedef enum { 369371c9d4SSatish Balay PETSCGAUSSLOBATTOLEGENDRE_VIA_LINEAR_ALGEBRA, 379371c9d4SSatish Balay PETSCGAUSSLOBATTOLEGENDRE_VIA_NEWTON 389371c9d4SSatish Balay } PetscGaussLobattoLegendreCreateType; 398272889dSSatish Balay 40d4afb720SToby Isaac /*E 41d4afb720SToby Isaac PetscDTNodeType - A description of strategies for generating nodes (both 42d4afb720SToby Isaac quadrature nodes and nodes for Lagrange polynomials) 43d4afb720SToby Isaac 4416a05f60SBarry Smith Values: 4516a05f60SBarry Smith + `PETSCDTNODES_DEFAULT` - Nodes chosen by PETSc 4616a05f60SBarry Smith . `PETSCDTNODES_GAUSSJACOBI` - Nodes at either Gauss-Jacobi or Gauss-Lobatto-Jacobi quadrature points 4716a05f60SBarry Smith . `PETSCDTNODES_EQUISPACED` - Nodes equispaced either including the endpoints or excluding them 4816a05f60SBarry Smith - `PETSCDTNODES_TANHSINH` - Nodes at Tanh-Sinh quadrature points 49d4afb720SToby Isaac 5016a05f60SBarry Smith Level: intermediate 51d4afb720SToby Isaac 5287497f52SBarry Smith Note: 5387497f52SBarry Smith A `PetscDTNodeType` can be paired with a `PetscBool` to indicate whether 5487497f52SBarry Smith the nodes include endpoints or not, and in the case of `PETSCDT_GAUSSJACOBI` 55d4afb720SToby Isaac with exponents for the weight function. 56d4afb720SToby Isaac 5716a05f60SBarry Smith .seealso: `PetscQuadrature` 58d4afb720SToby Isaac E*/ 599371c9d4SSatish Balay typedef enum { 609371c9d4SSatish Balay PETSCDTNODES_DEFAULT = -1, 61ce78bad3SBarry Smith PETSCDTNODES_GAUSSJACOBI = 0, 62ce78bad3SBarry Smith PETSCDTNODES_EQUISPACED = 1, 63ce78bad3SBarry Smith PETSCDTNODES_TANHSINH = 2 649371c9d4SSatish Balay } PetscDTNodeType; 65d4afb720SToby Isaac 66d3c69ad0SToby Isaac PETSC_EXTERN const char *const *const PetscDTNodeTypes; 67d3c69ad0SToby Isaac 68d3c69ad0SToby Isaac /*E 69d3c69ad0SToby Isaac PetscDTSimplexQuadratureType - A description of classes of quadrature rules for simplices 70d3c69ad0SToby Isaac 7116a05f60SBarry Smith Values: 7216a05f60SBarry Smith + `PETSCDTSIMPLEXQUAD_DEFAULT` - Quadrature rule chosen by PETSc 7316a05f60SBarry Smith . `PETSCDTSIMPLEXQUAD_CONIC` - Quadrature rules constructed as 74d3c69ad0SToby Isaac conically-warped tensor products of 1D 75d3c69ad0SToby Isaac Gauss-Jacobi quadrature rules. These are 76d3c69ad0SToby Isaac explicitly computable in any dimension for any 77d3c69ad0SToby Isaac degree, and the tensor-product structure can be 78d3c69ad0SToby Isaac exploited by sum-factorization methods, but 79d3c69ad0SToby Isaac they are not efficient in terms of nodes per 80d3c69ad0SToby Isaac polynomial degree. 8116a05f60SBarry Smith - `PETSCDTSIMPLEXQUAD_MINSYM` - Quadrature rules that are fully symmetric 82d3c69ad0SToby Isaac (symmetries of the simplex preserve the nodes 83d3c69ad0SToby Isaac and weights) with minimal (or near minimal) 84d3c69ad0SToby Isaac number of nodes. In dimensions higher than 1 85d3c69ad0SToby Isaac these are not simple to compute, so lookup 86d3c69ad0SToby Isaac tables are used. 87d3c69ad0SToby Isaac 8816a05f60SBarry Smith Level: intermediate 8916a05f60SBarry Smith 9016a05f60SBarry Smith .seealso: `PetscQuadrature`, `PetscDTSimplexQuadrature()` 91d3c69ad0SToby Isaac E*/ 929371c9d4SSatish Balay typedef enum { 939371c9d4SSatish Balay PETSCDTSIMPLEXQUAD_DEFAULT = -1, 949371c9d4SSatish Balay PETSCDTSIMPLEXQUAD_CONIC = 0, 95ce78bad3SBarry Smith PETSCDTSIMPLEXQUAD_MINSYM = 1 969371c9d4SSatish Balay } PetscDTSimplexQuadratureType; 97d3c69ad0SToby Isaac 98d3c69ad0SToby Isaac PETSC_EXTERN const char *const *const PetscDTSimplexQuadratureTypes; 99d4afb720SToby Isaac 10021454ff5SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscQuadratureCreate(MPI_Comm, PetscQuadrature *); 101c9638911SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscQuadratureDuplicate(PetscQuadrature, PetscQuadrature *); 1024366bac7SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscQuadratureGetCellType(PetscQuadrature, DMPolytopeType *); 1034366bac7SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscQuadratureSetCellType(PetscQuadrature, DMPolytopeType); 104bcede257SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscQuadratureGetOrder(PetscQuadrature, PetscInt *); 105bcede257SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscQuadratureSetOrder(PetscQuadrature, PetscInt); 106a6b92713SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscQuadratureGetNumComponents(PetscQuadrature, PetscInt *); 107a6b92713SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscQuadratureSetNumComponents(PetscQuadrature, PetscInt); 1084f9ab2b4SJed Brown PETSC_EXTERN PetscErrorCode PetscQuadratureEqual(PetscQuadrature, PetscQuadrature, PetscBool *); 109a6b92713SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscQuadratureGetData(PetscQuadrature, PetscInt *, PetscInt *, PetscInt *, const PetscReal *[], const PetscReal *[]); 110a6b92713SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscQuadratureSetData(PetscQuadrature, PetscInt, PetscInt, PetscInt, const PetscReal[], const PetscReal[]); 11121454ff5SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscQuadratureView(PetscQuadrature, PetscViewer); 11221454ff5SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscQuadratureDestroy(PetscQuadrature *); 113a0845e3aSMatthew G. Knepley 1142df84da0SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscDTTensorQuadratureCreate(PetscQuadrature, PetscQuadrature, PetscQuadrature *); 11589710940SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscQuadratureExpandComposite(PetscQuadrature, PetscInt, const PetscReal[], const PetscReal[], PetscQuadrature *); 1164366bac7SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscQuadratureComputePermutations(PetscQuadrature, PetscInt *, IS *[]); 11789710940SMatthew G. Knepley 118907761f8SToby Isaac PETSC_EXTERN PetscErrorCode PetscQuadraturePushForward(PetscQuadrature, PetscInt, const PetscReal[], const PetscReal[], const PetscReal[], PetscInt, PetscQuadrature *); 119907761f8SToby Isaac 12037045ce4SJed Brown PETSC_EXTERN PetscErrorCode PetscDTLegendreEval(PetscInt, const PetscReal *, PetscInt, const PetscInt *, PetscReal *, PetscReal *, PetscReal *); 121fbdc3dfeSToby Isaac PETSC_EXTERN PetscErrorCode PetscDTJacobiNorm(PetscReal, PetscReal, PetscInt, PetscReal *); 12294e21283SToby Isaac PETSC_EXTERN PetscErrorCode PetscDTJacobiEval(PetscInt, PetscReal, PetscReal, const PetscReal *, PetscInt, const PetscInt *, PetscReal *, PetscReal *, PetscReal *); 123fbdc3dfeSToby Isaac PETSC_EXTERN PetscErrorCode PetscDTJacobiEvalJet(PetscReal, PetscReal, PetscInt, const PetscReal[], PetscInt, PetscInt, PetscReal[]); 124fbdc3dfeSToby Isaac PETSC_EXTERN PetscErrorCode PetscDTPKDEvalJet(PetscInt, PetscInt, const PetscReal[], PetscInt, PetscInt, PetscReal[]); 125d8f25ad8SToby Isaac PETSC_EXTERN PetscErrorCode PetscDTPTrimmedSize(PetscInt, PetscInt, PetscInt, PetscInt *); 126d8f25ad8SToby Isaac PETSC_EXTERN PetscErrorCode PetscDTPTrimmedEvalJet(PetscInt, PetscInt, const PetscReal[], PetscInt, PetscInt, PetscInt, PetscReal[]); 12737045ce4SJed Brown PETSC_EXTERN PetscErrorCode PetscDTGaussQuadrature(PetscInt, PetscReal, PetscReal, PetscReal *, PetscReal *); 12894e21283SToby Isaac PETSC_EXTERN PetscErrorCode PetscDTGaussJacobiQuadrature(PetscInt, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal *, PetscReal *); 12994e21283SToby Isaac PETSC_EXTERN PetscErrorCode PetscDTGaussLobattoJacobiQuadrature(PetscInt, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal *, PetscReal *); 130916e780bShannah_mairs PETSC_EXTERN PetscErrorCode PetscDTGaussLobattoLegendreQuadrature(PetscInt, PetscGaussLobattoLegendreCreateType, PetscReal *, PetscReal *); 131194825f6SJed Brown PETSC_EXTERN PetscErrorCode PetscDTReconstructPoly(PetscInt, PetscInt, const PetscReal *, PetscInt, const PetscReal *, PetscReal *); 132a6b92713SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscDTGaussTensorQuadrature(PetscInt, PetscInt, PetscInt, PetscReal, PetscReal, PetscQuadrature *); 133e6a796c3SToby Isaac PETSC_EXTERN PetscErrorCode PetscDTStroudConicalQuadrature(PetscInt, PetscInt, PetscInt, PetscReal, PetscReal, PetscQuadrature *); 134d3c69ad0SToby Isaac PETSC_EXTERN PetscErrorCode PetscDTSimplexQuadrature(PetscInt, PetscInt, PetscDTSimplexQuadratureType, PetscQuadrature *); 1354366bac7SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscDTCreateDefaultQuadrature(DMPolytopeType, PetscInt, PetscQuadrature *, PetscQuadrature *); 136*f2c64c88SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscDTCreateQuadratureByCell(DMPolytopeType, PetscInt, PetscDTSimplexQuadratureType, PetscQuadrature *, PetscQuadrature *); 13737045ce4SJed Brown 138b3c0f97bSTom Klotz PETSC_EXTERN PetscErrorCode PetscDTTanhSinhTensorQuadrature(PetscInt, PetscInt, PetscReal, PetscReal, PetscQuadrature *); 139d6685f55SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscDTTanhSinhIntegrate(void (*)(const PetscReal[], void *, PetscReal *), PetscReal, PetscReal, PetscInt, void *, PetscReal *); 140d6685f55SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscDTTanhSinhIntegrateMPFR(void (*)(const PetscReal[], void *, PetscReal *), PetscReal, PetscReal, PetscInt, void *, PetscReal *); 141b3c0f97bSTom Klotz 142916e780bShannah_mairs PETSC_EXTERN PetscErrorCode PetscGaussLobattoLegendreIntegrate(PetscInt, PetscReal *, PetscReal *, const PetscReal *, PetscReal *); 143916e780bShannah_mairs PETSC_EXTERN PetscErrorCode PetscGaussLobattoLegendreElementLaplacianCreate(PetscInt, PetscReal *, PetscReal *, PetscReal ***); 144916e780bShannah_mairs PETSC_EXTERN PetscErrorCode PetscGaussLobattoLegendreElementLaplacianDestroy(PetscInt, PetscReal *, PetscReal *, PetscReal ***); 145916e780bShannah_mairs PETSC_EXTERN PetscErrorCode PetscGaussLobattoLegendreElementGradientCreate(PetscInt, PetscReal *, PetscReal *, PetscReal ***, PetscReal ***); 146916e780bShannah_mairs PETSC_EXTERN PetscErrorCode PetscGaussLobattoLegendreElementGradientDestroy(PetscInt, PetscReal *, PetscReal *, PetscReal ***, PetscReal ***); 147916e780bShannah_mairs PETSC_EXTERN PetscErrorCode PetscGaussLobattoLegendreElementAdvectionCreate(PetscInt, PetscReal *, PetscReal *, PetscReal ***); 148916e780bShannah_mairs PETSC_EXTERN PetscErrorCode PetscGaussLobattoLegendreElementAdvectionDestroy(PetscInt, PetscReal *, PetscReal *, PetscReal ***); 149916e780bShannah_mairs PETSC_EXTERN PetscErrorCode PetscGaussLobattoLegendreElementMassCreate(PetscInt, PetscReal *, PetscReal *, PetscReal ***); 150916e780bShannah_mairs PETSC_EXTERN PetscErrorCode PetscGaussLobattoLegendreElementMassDestroy(PetscInt, PetscReal *, PetscReal *, PetscReal ***); 151916e780bShannah_mairs 1522dce792eSToby Isaac /*MC 1532dce792eSToby Isaac PETSC_FORM_DEGREE_UNDEFINED - Indicates that a field does not have 1542dce792eSToby Isaac a well-defined form degree in exterior calculus. 1552dce792eSToby Isaac 1562dce792eSToby Isaac Level: advanced 1572dce792eSToby Isaac 1582dce792eSToby Isaac .seealso: `PetscDTAltV`, `PetscDualSpaceGetFormDegree()` 1592dce792eSToby Isaac M*/ 1602dce792eSToby Isaac #define PETSC_FORM_DEGREE_UNDEFINED PETSC_INT_MIN 1612dce792eSToby Isaac 1621a989b97SToby Isaac PETSC_EXTERN PetscErrorCode PetscDTAltVApply(PetscInt, PetscInt, const PetscReal *, const PetscReal *, PetscReal *); 1631a989b97SToby Isaac PETSC_EXTERN PetscErrorCode PetscDTAltVWedge(PetscInt, PetscInt, PetscInt, const PetscReal *, const PetscReal *, PetscReal *); 1641a989b97SToby Isaac PETSC_EXTERN PetscErrorCode PetscDTAltVWedgeMatrix(PetscInt, PetscInt, PetscInt, const PetscReal *, PetscReal *); 1651a989b97SToby Isaac PETSC_EXTERN PetscErrorCode PetscDTAltVPullback(PetscInt, PetscInt, const PetscReal *, PetscInt, const PetscReal *, PetscReal *); 1661a989b97SToby Isaac PETSC_EXTERN PetscErrorCode PetscDTAltVPullbackMatrix(PetscInt, PetscInt, const PetscReal *, PetscInt, PetscReal *); 1671a989b97SToby Isaac PETSC_EXTERN PetscErrorCode PetscDTAltVInterior(PetscInt, PetscInt, const PetscReal *, const PetscReal *, PetscReal *); 1681a989b97SToby Isaac PETSC_EXTERN PetscErrorCode PetscDTAltVInteriorMatrix(PetscInt, PetscInt, const PetscReal *, PetscReal *); 169dda711d0SToby Isaac PETSC_EXTERN PetscErrorCode PetscDTAltVInteriorPattern(PetscInt, PetscInt, PetscInt (*)[3]); 1701a989b97SToby Isaac PETSC_EXTERN PetscErrorCode PetscDTAltVStar(PetscInt, PetscInt, PetscInt, const PetscReal *, PetscReal *); 1711a989b97SToby Isaac 172d4afb720SToby Isaac PETSC_EXTERN PetscErrorCode PetscDTBaryToIndex(PetscInt, PetscInt, const PetscInt[], PetscInt *); 173d4afb720SToby Isaac PETSC_EXTERN PetscErrorCode PetscDTIndexToBary(PetscInt, PetscInt, PetscInt, PetscInt[]); 174fbdc3dfeSToby Isaac PETSC_EXTERN PetscErrorCode PetscDTGradedOrderToIndex(PetscInt, const PetscInt[], PetscInt *); 175fbdc3dfeSToby Isaac PETSC_EXTERN PetscErrorCode PetscDTIndexToGradedOrder(PetscInt, PetscInt, PetscInt[]); 176d4afb720SToby Isaac 177fad4db65SToby Isaac #if defined(PETSC_USE_64BIT_INDICES) 178fad4db65SToby Isaac #define PETSC_FACTORIAL_MAX 20 179fad4db65SToby Isaac #define PETSC_BINOMIAL_MAX 61 180fad4db65SToby Isaac #else 181fad4db65SToby Isaac #define PETSC_FACTORIAL_MAX 12 182fad4db65SToby Isaac #define PETSC_BINOMIAL_MAX 29 183fad4db65SToby Isaac #endif 184fad4db65SToby Isaac 185fad4db65SToby Isaac /*MC 186fad4db65SToby Isaac PetscDTFactorial - Approximate n! as a real number 187fad4db65SToby Isaac 1884165533cSJose E. Roman Input Parameter: 189fad4db65SToby Isaac . n - a non-negative integer 190fad4db65SToby Isaac 1914165533cSJose E. Roman Output Parameter: 192fad4db65SToby Isaac . factorial - n! 193fad4db65SToby Isaac 194fad4db65SToby Isaac Level: beginner 19516a05f60SBarry Smith 19616a05f60SBarry Smith .seealso: `PetscDTFactorialInt()`, `PetscDTBinomialInt()`, `PetscDTBinomial()` 197fad4db65SToby Isaac M*/ 198d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscDTFactorial(PetscInt n, PetscReal *factorial) 199d71ae5a4SJacob Faibussowitsch { 200fad4db65SToby Isaac PetscReal f = 1.0; 201fad4db65SToby Isaac 202fad4db65SToby Isaac PetscFunctionBegin; 203e2ab39ccSLisandro Dalcin *factorial = -1.0; 20463a3b9bcSJacob Faibussowitsch PetscCheck(n >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Factorial called with negative number %" PetscInt_FMT, n); 2055f80ce2aSJacob Faibussowitsch for (PetscInt i = 1; i < n + 1; ++i) f *= (PetscReal)i; 206fad4db65SToby Isaac *factorial = f; 2073ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 208fad4db65SToby Isaac } 209fad4db65SToby Isaac 210fad4db65SToby Isaac /*MC 211fad4db65SToby Isaac PetscDTFactorialInt - Compute n! as an integer 212fad4db65SToby Isaac 2134165533cSJose E. Roman Input Parameter: 214fad4db65SToby Isaac . n - a non-negative integer 215fad4db65SToby Isaac 2164165533cSJose E. Roman Output Parameter: 217fad4db65SToby Isaac . factorial - n! 218fad4db65SToby Isaac 219fad4db65SToby Isaac Level: beginner 220fad4db65SToby Isaac 22116a05f60SBarry Smith Note: 22295bd0b28SBarry Smith This is limited to `n` such that n! can be represented by `PetscInt`, which is 12 if `PetscInt` is a signed 32-bit integer and 20 if `PetscInt` is a signed 64-bit integer. 22316a05f60SBarry Smith 22416a05f60SBarry Smith .seealso: `PetscDTFactorial()`, `PetscDTBinomialInt()`, `PetscDTBinomial()` 225fad4db65SToby Isaac M*/ 226d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscDTFactorialInt(PetscInt n, PetscInt *factorial) 227d71ae5a4SJacob Faibussowitsch { 228fad4db65SToby Isaac PetscInt facLookup[13] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600}; 229fad4db65SToby Isaac 23028222859SToby Isaac PetscFunctionBegin; 23128222859SToby Isaac *factorial = -1; 23263a3b9bcSJacob Faibussowitsch PetscCheck(n >= 0 && n <= PETSC_FACTORIAL_MAX, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of elements %" PetscInt_FMT " is not in supported range [0,%d]", n, PETSC_FACTORIAL_MAX); 233fad4db65SToby Isaac if (n <= 12) { 234fad4db65SToby Isaac *factorial = facLookup[n]; 235fad4db65SToby Isaac } else { 236fad4db65SToby Isaac PetscInt f = facLookup[12]; 237fad4db65SToby Isaac PetscInt i; 238fad4db65SToby Isaac 239fad4db65SToby Isaac for (i = 13; i < n + 1; ++i) f *= i; 240fad4db65SToby Isaac *factorial = f; 241fad4db65SToby Isaac } 2423ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 243fad4db65SToby Isaac } 244fad4db65SToby Isaac 245fad4db65SToby Isaac /*MC 24695bd0b28SBarry Smith PetscDTBinomial - Approximate the binomial coefficient `n` choose `k` 247fad4db65SToby Isaac 2484165533cSJose E. Roman Input Parameters: 249fad4db65SToby Isaac + n - a non-negative integer 25095bd0b28SBarry Smith - k - an integer between 0 and `n`, inclusive 251fad4db65SToby Isaac 2524165533cSJose E. Roman Output Parameter: 25395bd0b28SBarry Smith . binomial - approximation of the binomial coefficient `n` choose `k` 254fad4db65SToby Isaac 255fad4db65SToby Isaac Level: beginner 25616a05f60SBarry Smith 25716a05f60SBarry Smith .seealso: `PetscDTFactorial()`, `PetscDTFactorialInt()`, `PetscDTBinomialInt()`, `PetscDTEnumPerm()` 258fad4db65SToby Isaac M*/ 259d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscDTBinomial(PetscInt n, PetscInt k, PetscReal *binomial) 260d71ae5a4SJacob Faibussowitsch { 2611a989b97SToby Isaac PetscFunctionBeginHot; 262e2ab39ccSLisandro Dalcin *binomial = -1.0; 26363a3b9bcSJacob Faibussowitsch PetscCheck(n >= 0 && k >= 0 && k <= n, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Binomial arguments (%" PetscInt_FMT " %" PetscInt_FMT ") must be non-negative, k <= n", n, k); 2641a989b97SToby Isaac if (n <= 3) { 2659371c9d4SSatish Balay PetscInt binomLookup[4][4] = { 2669371c9d4SSatish Balay {1, 0, 0, 0}, 2679371c9d4SSatish Balay {1, 1, 0, 0}, 2689371c9d4SSatish Balay {1, 2, 1, 0}, 2699371c9d4SSatish Balay {1, 3, 3, 1} 2709371c9d4SSatish Balay }; 2711a989b97SToby Isaac 272e2ab39ccSLisandro Dalcin *binomial = (PetscReal)binomLookup[n][k]; 2731a989b97SToby Isaac } else { 274e2ab39ccSLisandro Dalcin PetscReal binom = 1.0; 2751a989b97SToby Isaac 2761a989b97SToby Isaac k = PetscMin(k, n - k); 2775f80ce2aSJacob Faibussowitsch for (PetscInt i = 0; i < k; i++) binom = (binom * (PetscReal)(n - i)) / (PetscReal)(i + 1); 2781a989b97SToby Isaac *binomial = binom; 2791a989b97SToby Isaac } 2803ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2811a989b97SToby Isaac } 2821a989b97SToby Isaac 283fad4db65SToby Isaac /*MC 28495bd0b28SBarry Smith PetscDTBinomialInt - Compute the binomial coefficient `n` choose `k` 285fad4db65SToby Isaac 28697bb3fdcSJose E. Roman Input Parameters: 287fad4db65SToby Isaac + n - a non-negative integer 28895bd0b28SBarry Smith - k - an integer between 0 and `n`, inclusive 289fad4db65SToby Isaac 29097bb3fdcSJose E. Roman Output Parameter: 29195bd0b28SBarry Smith . binomial - the binomial coefficient `n` choose `k` 292fad4db65SToby Isaac 293fad4db65SToby Isaac Level: beginner 29416a05f60SBarry Smith 29516a05f60SBarry Smith Note: 29616a05f60SBarry Smith This is limited by integers that can be represented by `PetscInt`. 29716a05f60SBarry Smith 29816a05f60SBarry Smith Use `PetscDTBinomial()` for real number approximations of larger values 29916a05f60SBarry Smith 30016a05f60SBarry Smith .seealso: `PetscDTFactorial()`, `PetscDTFactorialInt()`, `PetscDTBinomial()`, `PetscDTEnumPerm()` 301fad4db65SToby Isaac M*/ 302d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscDTBinomialInt(PetscInt n, PetscInt k, PetscInt *binomial) 303d71ae5a4SJacob Faibussowitsch { 30428222859SToby Isaac PetscInt bin; 30528222859SToby Isaac 30628222859SToby Isaac PetscFunctionBegin; 30728222859SToby Isaac *binomial = -1; 30863a3b9bcSJacob Faibussowitsch PetscCheck(n >= 0 && k >= 0 && k <= n, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Binomial arguments (%" PetscInt_FMT " %" PetscInt_FMT ") must be non-negative, k <= n", n, k); 30963a3b9bcSJacob Faibussowitsch PetscCheck(n <= PETSC_BINOMIAL_MAX, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Binomial elements %" PetscInt_FMT " is larger than max for PetscInt, %d", n, PETSC_BINOMIAL_MAX); 310fad4db65SToby Isaac if (n <= 3) { 3119371c9d4SSatish Balay PetscInt binomLookup[4][4] = { 3129371c9d4SSatish Balay {1, 0, 0, 0}, 3139371c9d4SSatish Balay {1, 1, 0, 0}, 3149371c9d4SSatish Balay {1, 2, 1, 0}, 3159371c9d4SSatish Balay {1, 3, 3, 1} 3169371c9d4SSatish Balay }; 317fad4db65SToby Isaac 31828222859SToby Isaac bin = binomLookup[n][k]; 319fad4db65SToby Isaac } else { 320fad4db65SToby Isaac PetscInt binom = 1; 321fad4db65SToby Isaac 322fad4db65SToby Isaac k = PetscMin(k, n - k); 3235f80ce2aSJacob Faibussowitsch for (PetscInt i = 0; i < k; i++) binom = (binom * (n - i)) / (i + 1); 32428222859SToby Isaac bin = binom; 325fad4db65SToby Isaac } 32628222859SToby Isaac *binomial = bin; 3273ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 328fad4db65SToby Isaac } 329fad4db65SToby Isaac 330ce78bad3SBarry Smith /* the following inline routines should be not be inline routines and then Fortran binding can be built automatically */ 331ce78bad3SBarry Smith #define PeOp 332ce78bad3SBarry Smith 333fad4db65SToby Isaac /*MC 33416a05f60SBarry Smith PetscDTEnumPerm - Get a permutation of `n` integers from its encoding into the integers [0, n!) as a sequence of swaps. 335fad4db65SToby Isaac 3364165533cSJose E. Roman Input Parameters: 337fad4db65SToby Isaac + n - a non-negative integer (see note about limits below) 3388cd1e013SToby Isaac - k - an integer in [0, n!) 339fad4db65SToby Isaac 3404165533cSJose E. Roman Output Parameters: 341fad4db65SToby Isaac + perm - the permuted list of the integers [0, ..., n-1] 3422fe279fdSBarry Smith - isOdd - if not `NULL`, returns whether the permutation used an even or odd number of swaps. 343fad4db65SToby Isaac 34416a05f60SBarry Smith Level: intermediate 345fad4db65SToby Isaac 34616a05f60SBarry Smith Notes: 34716a05f60SBarry Smith A permutation can be described by the operations that convert the lists [0, 1, ..., n-1] into the permutation, 34816a05f60SBarry Smith by a sequence of swaps, where the ith step swaps whatever number is in ith position with a number that is in 34916a05f60SBarry Smith some position j >= i. This swap is encoded as the difference (j - i). The difference d_i at step i is less than 35016a05f60SBarry Smith (n - i). This sequence of n-1 differences [d_0, ..., d_{n-2}] is encoded as the number 35116a05f60SBarry Smith (n-1)! * d_0 + (n-2)! * d_1 + ... + 1! * d_{n-2}. 35216a05f60SBarry Smith 35316a05f60SBarry Smith Limited to `n` such that `n`! can be represented by `PetscInt`, which is 12 if `PetscInt` is a signed 32-bit integer and 20 if `PetscInt` is a signed 64-bit integer. 35416a05f60SBarry Smith 35516a05f60SBarry Smith .seealso: `PetscDTFactorial()`, `PetscDTFactorialInt()`, `PetscDTBinomial()`, `PetscDTBinomialInt()`, `PetscDTPermIndex()` 356fad4db65SToby Isaac M*/ 357ce78bad3SBarry Smith static inline PetscErrorCode PetscDTEnumPerm(PetscInt n, PetscInt k, PetscInt *perm, PeOp PetscBool *isOdd) 358d71ae5a4SJacob Faibussowitsch { 3591a989b97SToby Isaac PetscInt odd = 0; 3601a989b97SToby Isaac PetscInt i; 361fad4db65SToby Isaac PetscInt work[PETSC_FACTORIAL_MAX]; 362fad4db65SToby Isaac PetscInt *w; 3631a989b97SToby Isaac 36428222859SToby Isaac PetscFunctionBegin; 36528222859SToby Isaac if (isOdd) *isOdd = PETSC_FALSE; 36663a3b9bcSJacob Faibussowitsch PetscCheck(n >= 0 && n <= PETSC_FACTORIAL_MAX, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of elements %" PetscInt_FMT " is not in supported range [0,%d]", n, PETSC_FACTORIAL_MAX); 367810441c8SPierre Jolivet if (n >= 2) { 368fad4db65SToby Isaac w = &work[n - 2]; 3691a989b97SToby Isaac for (i = 2; i <= n; i++) { 3701a989b97SToby Isaac *(w--) = k % i; 3711a989b97SToby Isaac k /= i; 3721a989b97SToby Isaac } 373810441c8SPierre Jolivet } 3741a989b97SToby Isaac for (i = 0; i < n; i++) perm[i] = i; 3751a989b97SToby Isaac for (i = 0; i < n - 1; i++) { 3761a989b97SToby Isaac PetscInt s = work[i]; 3771a989b97SToby Isaac PetscInt swap = perm[i]; 3781a989b97SToby Isaac 3791a989b97SToby Isaac perm[i] = perm[i + s]; 3801a989b97SToby Isaac perm[i + s] = swap; 3811a989b97SToby Isaac odd ^= (!!s); 3821a989b97SToby Isaac } 3831a989b97SToby Isaac if (isOdd) *isOdd = odd ? PETSC_TRUE : PETSC_FALSE; 3843ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3851a989b97SToby Isaac } 3861a989b97SToby Isaac 387fad4db65SToby Isaac /*MC 38816a05f60SBarry Smith PetscDTPermIndex - Encode a permutation of n into an integer in [0, n!). This inverts `PetscDTEnumPerm()`. 3898cd1e013SToby Isaac 3904165533cSJose E. Roman Input Parameters: 3918cd1e013SToby Isaac + n - a non-negative integer (see note about limits below) 3928cd1e013SToby Isaac - perm - the permuted list of the integers [0, ..., n-1] 3938cd1e013SToby Isaac 3944165533cSJose E. Roman Output Parameters: 3958cd1e013SToby Isaac + k - an integer in [0, n!) 3962fe279fdSBarry Smith - isOdd - if not `NULL`, returns whether the permutation used an even or odd number of swaps. 3978cd1e013SToby Isaac 3988cd1e013SToby Isaac Level: beginner 39916a05f60SBarry Smith 40016a05f60SBarry Smith Note: 40116a05f60SBarry Smith Limited to `n` such that `n`! can be represented by `PetscInt`, which is 12 if `PetscInt` is a signed 32-bit integer and 20 if `PetscInt` is a signed 64-bit integer. 40216a05f60SBarry Smith 40316a05f60SBarry Smith .seealso: `PetscDTFactorial()`, `PetscDTFactorialInt()`, `PetscDTBinomial()`, `PetscDTBinomialInt()`, `PetscDTEnumPerm()` 4048cd1e013SToby Isaac M*/ 405ce78bad3SBarry Smith static inline PetscErrorCode PetscDTPermIndex(PetscInt n, const PetscInt *perm, PetscInt *k, PeOp PetscBool *isOdd) 406d71ae5a4SJacob Faibussowitsch { 4078cd1e013SToby Isaac PetscInt odd = 0; 4088cd1e013SToby Isaac PetscInt i, idx; 4098cd1e013SToby Isaac PetscInt work[PETSC_FACTORIAL_MAX]; 4108cd1e013SToby Isaac PetscInt iwork[PETSC_FACTORIAL_MAX]; 4118cd1e013SToby Isaac 4128cd1e013SToby Isaac PetscFunctionBeginHot; 41328222859SToby Isaac *k = -1; 41428222859SToby Isaac if (isOdd) *isOdd = PETSC_FALSE; 41563a3b9bcSJacob Faibussowitsch PetscCheck(n >= 0 && n <= PETSC_FACTORIAL_MAX, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of elements %" PetscInt_FMT " is not in supported range [0,%d]", n, PETSC_FACTORIAL_MAX); 4168cd1e013SToby Isaac for (i = 0; i < n; i++) work[i] = i; /* partial permutation */ 4178cd1e013SToby Isaac for (i = 0; i < n; i++) iwork[i] = i; /* partial permutation inverse */ 4188cd1e013SToby Isaac for (idx = 0, i = 0; i < n - 1; i++) { 4198cd1e013SToby Isaac PetscInt j = perm[i]; 4208cd1e013SToby Isaac PetscInt icur = work[i]; 4218cd1e013SToby Isaac PetscInt jloc = iwork[j]; 4228cd1e013SToby Isaac PetscInt diff = jloc - i; 4238cd1e013SToby Isaac 4248cd1e013SToby Isaac idx = idx * (n - i) + diff; 4258cd1e013SToby Isaac /* swap (i, jloc) */ 4268cd1e013SToby Isaac work[i] = j; 4278cd1e013SToby Isaac work[jloc] = icur; 4288cd1e013SToby Isaac iwork[j] = i; 4298cd1e013SToby Isaac iwork[icur] = jloc; 4308cd1e013SToby Isaac odd ^= (!!diff); 4318cd1e013SToby Isaac } 4328cd1e013SToby Isaac *k = idx; 4338cd1e013SToby Isaac if (isOdd) *isOdd = odd ? PETSC_TRUE : PETSC_FALSE; 4343ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4358cd1e013SToby Isaac } 4368cd1e013SToby Isaac 4378cd1e013SToby Isaac /*MC 438fad4db65SToby Isaac PetscDTEnumSubset - Get an ordered subset of the integers [0, ..., n - 1] from its encoding as an integers in [0, n choose k). 439fad4db65SToby Isaac The encoding is in lexicographic order. 440fad4db65SToby Isaac 4414165533cSJose E. Roman Input Parameters: 442fad4db65SToby Isaac + n - a non-negative integer (see note about limits below) 443fad4db65SToby Isaac . k - an integer in [0, n] 444fad4db65SToby Isaac - j - an index in [0, n choose k) 445fad4db65SToby Isaac 4464165533cSJose E. Roman Output Parameter: 447fad4db65SToby Isaac . subset - the jth subset of size k of the integers [0, ..., n - 1] 448fad4db65SToby Isaac 449fad4db65SToby Isaac Level: beginner 450fad4db65SToby Isaac 45116a05f60SBarry Smith Note: 45216a05f60SBarry Smith Limited by arguments such that `n` choose `k` can be represented by `PetscInt` 45316a05f60SBarry Smith 45416a05f60SBarry Smith .seealso: `PetscDTSubsetIndex()`, `PetscDTFactorial()`, `PetscDTFactorialInt()`, `PetscDTBinomial()`, `PetscDTBinomialInt()`, `PetscDTEnumPerm()`, `PetscDTPermIndex()` 455fad4db65SToby Isaac M*/ 456d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscDTEnumSubset(PetscInt n, PetscInt k, PetscInt j, PetscInt *subset) 457d71ae5a4SJacob Faibussowitsch { 4585f80ce2aSJacob Faibussowitsch PetscInt Nk; 4591a989b97SToby Isaac 4601a989b97SToby Isaac PetscFunctionBeginHot; 4619566063dSJacob Faibussowitsch PetscCall(PetscDTBinomialInt(n, k, &Nk)); 4625f80ce2aSJacob Faibussowitsch for (PetscInt i = 0, l = 0; i < n && l < k; i++) { 4631a989b97SToby Isaac PetscInt Nminuskminus = (Nk * (k - l)) / (n - i); 4641a989b97SToby Isaac PetscInt Nminusk = Nk - Nminuskminus; 4651a989b97SToby Isaac 4661a989b97SToby Isaac if (j < Nminuskminus) { 4671a989b97SToby Isaac subset[l++] = i; 4681a989b97SToby Isaac Nk = Nminuskminus; 4691a989b97SToby Isaac } else { 4701a989b97SToby Isaac j -= Nminuskminus; 4711a989b97SToby Isaac Nk = Nminusk; 4721a989b97SToby Isaac } 4731a989b97SToby Isaac } 4743ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4751a989b97SToby Isaac } 4761a989b97SToby Isaac 477fad4db65SToby Isaac /*MC 47887497f52SBarry Smith PetscDTSubsetIndex - Convert an ordered subset of k integers from the set [0, ..., n - 1] to its encoding as an integers in [0, n choose k) in lexicographic order. 47987497f52SBarry Smith This is the inverse of `PetscDTEnumSubset`. 480fad4db65SToby Isaac 4814165533cSJose E. Roman Input Parameters: 482fad4db65SToby Isaac + n - a non-negative integer (see note about limits below) 483fad4db65SToby Isaac . k - an integer in [0, n] 484fad4db65SToby Isaac - subset - an ordered subset of the integers [0, ..., n - 1] 485fad4db65SToby Isaac 4864165533cSJose E. Roman Output Parameter: 487fad4db65SToby Isaac . index - the rank of the subset in lexicographic order 488fad4db65SToby Isaac 489fad4db65SToby Isaac Level: beginner 490fad4db65SToby Isaac 49116a05f60SBarry Smith Note: 49216a05f60SBarry Smith Limited by arguments such that `n` choose `k` can be represented by `PetscInt` 49316a05f60SBarry Smith 49416a05f60SBarry Smith .seealso: `PetscDTEnumSubset()`, `PetscDTFactorial()`, `PetscDTFactorialInt()`, `PetscDTBinomial()`, `PetscDTBinomialInt()`, `PetscDTEnumPerm()`, `PetscDTPermIndex()` 495fad4db65SToby Isaac M*/ 496d71ae5a4SJacob Faibussowitsch static inline PetscErrorCode PetscDTSubsetIndex(PetscInt n, PetscInt k, const PetscInt *subset, PetscInt *index) 497d71ae5a4SJacob Faibussowitsch { 4985f80ce2aSJacob Faibussowitsch PetscInt j = 0, Nk; 4991a989b97SToby Isaac 50028222859SToby Isaac PetscFunctionBegin; 50128222859SToby Isaac *index = -1; 5029566063dSJacob Faibussowitsch PetscCall(PetscDTBinomialInt(n, k, &Nk)); 5035f80ce2aSJacob Faibussowitsch for (PetscInt i = 0, l = 0; i < n && l < k; i++) { 5041a989b97SToby Isaac PetscInt Nminuskminus = (Nk * (k - l)) / (n - i); 5051a989b97SToby Isaac PetscInt Nminusk = Nk - Nminuskminus; 5061a989b97SToby Isaac 5071a989b97SToby Isaac if (subset[l] == i) { 5081a989b97SToby Isaac l++; 5091a989b97SToby Isaac Nk = Nminuskminus; 5101a989b97SToby Isaac } else { 5111a989b97SToby Isaac j += Nminuskminus; 5121a989b97SToby Isaac Nk = Nminusk; 5131a989b97SToby Isaac } 5141a989b97SToby Isaac } 5151a989b97SToby Isaac *index = j; 5163ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5171a989b97SToby Isaac } 5181a989b97SToby Isaac 519fad4db65SToby Isaac /*MC 52089521216SMatthew G. Knepley PetscDTEnumSplit - Split the integers [0, ..., n - 1] into two complementary ordered subsets, the first subset of size k and being the jth subset of that size in lexicographic order. 521fad4db65SToby Isaac 5224165533cSJose E. Roman Input Parameters: 523fad4db65SToby Isaac + n - a non-negative integer (see note about limits below) 524fad4db65SToby Isaac . k - an integer in [0, n] 525fad4db65SToby Isaac - j - an index in [0, n choose k) 526fad4db65SToby Isaac 5274165533cSJose E. Roman Output Parameters: 528fad4db65SToby Isaac + perm - the jth subset of size k of the integers [0, ..., n - 1], followed by its complementary set. 5292fe279fdSBarry Smith - isOdd - if not `NULL`, return whether perm is an even or odd permutation. 530fad4db65SToby Isaac 531fad4db65SToby Isaac Level: beginner 532fad4db65SToby Isaac 53316a05f60SBarry Smith Note: 53416a05f60SBarry Smith Limited by arguments such that `n` choose `k` can be represented by `PetscInt` 53516a05f60SBarry Smith 53616a05f60SBarry Smith .seealso: `PetscDTEnumSubset()`, `PetscDTSubsetIndex()`, `PetscDTFactorial()`, `PetscDTFactorialInt()`, `PetscDTBinomial()`, `PetscDTBinomialInt()`, `PetscDTEnumPerm()`, 53716a05f60SBarry Smith `PetscDTPermIndex()` 538fad4db65SToby Isaac M*/ 539ce78bad3SBarry Smith static inline PetscErrorCode PetscDTEnumSplit(PetscInt n, PetscInt k, PetscInt j, PetscInt *perm, PeOp PetscBool *isOdd) 540d71ae5a4SJacob Faibussowitsch { 5415f80ce2aSJacob Faibussowitsch PetscInt i, l, m, Nk, odd = 0; 5428e3a54c0SPierre Jolivet PetscInt *subcomp = PetscSafePointerPlusOffset(perm, k); 5431a989b97SToby Isaac 54428222859SToby Isaac PetscFunctionBegin; 54528222859SToby Isaac if (isOdd) *isOdd = PETSC_FALSE; 5469566063dSJacob Faibussowitsch PetscCall(PetscDTBinomialInt(n, k, &Nk)); 5471a989b97SToby Isaac for (i = 0, l = 0, m = 0; i < n && l < k; i++) { 5481a989b97SToby Isaac PetscInt Nminuskminus = (Nk * (k - l)) / (n - i); 5491a989b97SToby Isaac PetscInt Nminusk = Nk - Nminuskminus; 5501a989b97SToby Isaac 5511a989b97SToby Isaac if (j < Nminuskminus) { 552fad4db65SToby Isaac perm[l++] = i; 5531a989b97SToby Isaac Nk = Nminuskminus; 5541a989b97SToby Isaac } else { 5551a989b97SToby Isaac subcomp[m++] = i; 5561a989b97SToby Isaac j -= Nminuskminus; 5571a989b97SToby Isaac odd ^= ((k - l) & 1); 5581a989b97SToby Isaac Nk = Nminusk; 5591a989b97SToby Isaac } 5601a989b97SToby Isaac } 5615f80ce2aSJacob Faibussowitsch for (; i < n; i++) subcomp[m++] = i; 5621a989b97SToby Isaac if (isOdd) *isOdd = odd ? PETSC_TRUE : PETSC_FALSE; 5633ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5641a989b97SToby Isaac } 5651a989b97SToby Isaac 566ce78bad3SBarry Smith struct _n_PetscTabulation { 567a5b23f4aSJose E. Roman PetscInt K; /* Indicates a k-jet, namely tabulated derivatives up to order k */ 56819815104SMartin Diehl PetscInt Nr; /* The number of tabulation replicas (often 1) */ 569ef0bb6c7SMatthew G. Knepley PetscInt Np; /* The number of tabulation points in a replica */ 570ef0bb6c7SMatthew G. Knepley PetscInt Nb; /* The number of functions tabulated */ 571ef0bb6c7SMatthew G. Knepley PetscInt Nc; /* The number of function components */ 572ef0bb6c7SMatthew G. Knepley PetscInt cdim; /* The coordinate dimension */ 573ef0bb6c7SMatthew G. Knepley PetscReal **T; /* The tabulation T[K] of functions and their derivatives 574ef0bb6c7SMatthew G. Knepley T[0] = B[Nr*Np][Nb][Nc]: The basis function values at quadrature points 575ef0bb6c7SMatthew G. Knepley T[1] = D[Nr*Np][Nb][Nc][cdim]: The basis function derivatives at quadrature points 576ef0bb6c7SMatthew G. Knepley T[2] = H[Nr*Np][Nb][Nc][cdim][cdim]: The basis function second derivatives at quadrature points */ 577ef0bb6c7SMatthew G. Knepley }; 578ce78bad3SBarry Smith 579ce78bad3SBarry Smith /*S 580ce78bad3SBarry Smith PetscTabulation - PETSc object that manages tabulations for finite element methods. 581ce78bad3SBarry Smith 582ce78bad3SBarry Smith Level: intermediate 583ce78bad3SBarry Smith 584ce78bad3SBarry Smith Note: 585ce78bad3SBarry Smith This is a pointer to a C struct, hence the data in it may be accessed directly. 586ce78bad3SBarry Smith 587ce78bad3SBarry Smith Fortran Note: 588ce78bad3SBarry Smith Use `PetscTabulationGetData()` and `PetscTabulationRestoreData()` to access the arrays in the tabulation. 589ce78bad3SBarry Smith 590ce78bad3SBarry Smith Developer Note: 591ce78bad3SBarry Smith TODO: put the meaning of the struct fields in this manual page 592ce78bad3SBarry Smith 593ce78bad3SBarry Smith .seealso: `PetscTabulationDestroy()`, `PetscFECreateTabulation()`, `PetscFEGetCellTabulation()` 594ce78bad3SBarry Smith S*/ 595ce78bad3SBarry Smith typedef struct _n_PetscTabulation *PetscTabulation; 596ef0bb6c7SMatthew G. Knepley 597f8662bd6SBarry Smith /*S 598f8662bd6SBarry Smith PetscProbFn - A prototype of a PDF or CDF used with PETSc probability operations whose names begin with `PetscProb` such as 599f8662bd6SBarry Smith `PetscProbComputeKSStatistic()`. 600f8662bd6SBarry Smith 601f8662bd6SBarry Smith Calling Sequence: 602f8662bd6SBarry Smith + x - input value 603f8662bd6SBarry Smith . scale - scale factor, I don't know what this is for 604f8662bd6SBarry Smith - result - the value of the PDF or CDF at the input value 605f8662bd6SBarry Smith 606f8662bd6SBarry Smith Level: beginner 607f8662bd6SBarry Smith 608f8662bd6SBarry Smith Developer Note: 609f8662bd6SBarry Smith Why does this take an array argument for `result` when it seems to be able to output a single value? 610f8662bd6SBarry Smith 611f8662bd6SBarry Smith .seealso: `PetscProbComputeKSStatistic()`, `PetscProbComputeKSStatisticWeighted()`, `PetscPDFMaxwellBoltzmann1D()` 612f8662bd6SBarry Smith S*/ 613f8662bd6SBarry Smith typedef PetscErrorCode PetscProbFn(const PetscReal x[], const PetscReal scale[], PetscReal result[]); 614f8662bd6SBarry Smith 615f8662bd6SBarry Smith PETSC_EXTERN_TYPEDEF typedef PetscProbFn *PetscProbFunc PETSC_DEPRECATED_TYPEDEF(3, 24, 0, "PetscProbFn*", ); 616d6685f55SMatthew G. Knepley 6179371c9d4SSatish Balay typedef enum { 6189371c9d4SSatish Balay DTPROB_DENSITY_CONSTANT, 6199371c9d4SSatish Balay DTPROB_DENSITY_GAUSSIAN, 6209371c9d4SSatish Balay DTPROB_DENSITY_MAXWELL_BOLTZMANN, 6219371c9d4SSatish Balay DTPROB_NUM_DENSITY 6229371c9d4SSatish Balay } DTProbDensityType; 623d6685f55SMatthew G. Knepley PETSC_EXTERN const char *const DTProbDensityTypes[]; 624d6685f55SMatthew G. Knepley 625f8662bd6SBarry Smith PETSC_EXTERN PetscProbFn PetscPDFMaxwellBoltzmann1D; 626f8662bd6SBarry Smith PETSC_EXTERN PetscProbFn PetscCDFMaxwellBoltzmann1D; 627f8662bd6SBarry Smith PETSC_EXTERN PetscProbFn PetscPDFMaxwellBoltzmann2D; 628f8662bd6SBarry Smith PETSC_EXTERN PetscProbFn PetscCDFMaxwellBoltzmann2D; 629f8662bd6SBarry Smith PETSC_EXTERN PetscProbFn PetscPDFMaxwellBoltzmann3D; 630f8662bd6SBarry Smith PETSC_EXTERN PetscProbFn PetscCDFMaxwellBoltzmann3D; 631f8662bd6SBarry Smith PETSC_EXTERN PetscProbFn PetscPDFGaussian1D; 632f8662bd6SBarry Smith PETSC_EXTERN PetscProbFn PetscCDFGaussian1D; 633f8662bd6SBarry Smith PETSC_EXTERN PetscProbFn PetscPDFSampleGaussian1D; 634f8662bd6SBarry Smith PETSC_EXTERN PetscProbFn PetscPDFGaussian2D; 635f8662bd6SBarry Smith PETSC_EXTERN PetscProbFn PetscPDFSampleGaussian2D; 636f8662bd6SBarry Smith PETSC_EXTERN PetscProbFn PetscPDFGaussian3D; 637f8662bd6SBarry Smith PETSC_EXTERN PetscProbFn PetscPDFSampleGaussian3D; 638f8662bd6SBarry Smith PETSC_EXTERN PetscProbFn PetscPDFConstant1D; 639f8662bd6SBarry Smith PETSC_EXTERN PetscProbFn PetscCDFConstant1D; 640f8662bd6SBarry Smith PETSC_EXTERN PetscProbFn PetscPDFSampleConstant1D; 641f8662bd6SBarry Smith PETSC_EXTERN PetscProbFn PetscPDFConstant2D; 642f8662bd6SBarry Smith PETSC_EXTERN PetscProbFn PetscCDFConstant2D; 643f8662bd6SBarry Smith PETSC_EXTERN PetscProbFn PetscPDFSampleConstant2D; 644f8662bd6SBarry Smith PETSC_EXTERN PetscProbFn PetscPDFConstant3D; 645f8662bd6SBarry Smith PETSC_EXTERN PetscProbFn PetscCDFConstant3D; 646f8662bd6SBarry Smith PETSC_EXTERN PetscProbFn PetscPDFSampleConstant3D; 647f8662bd6SBarry Smith PETSC_EXTERN PetscErrorCode PetscProbCreateFromOptions(PetscInt, const char[], const char[], PetscProbFn **, PetscProbFn **, PetscProbFn **); 648d6685f55SMatthew G. Knepley 649d6685f55SMatthew G. Knepley #include <petscvec.h> 650d6685f55SMatthew G. Knepley 651f8662bd6SBarry Smith PETSC_EXTERN PetscErrorCode PetscProbComputeKSStatistic(Vec, PetscProbFn *, PetscReal *); 652f8662bd6SBarry Smith PETSC_EXTERN PetscErrorCode PetscProbComputeKSStatisticWeighted(Vec, Vec, PetscProbFn *, PetscReal *); 653f8662bd6SBarry Smith PETSC_EXTERN PetscErrorCode PetscProbComputeKSStatisticMagnitude(Vec, PetscProbFn *, PetscReal *); 654