1d6685f55SMatthew G. Knepley #include <petscdt.h> /*I "petscdt.h" I*/ 2d6685f55SMatthew G. Knepley 3d6685f55SMatthew G. Knepley #include <petscvec.h> 4d6685f55SMatthew G. Knepley #include <petscdraw.h> 5d6685f55SMatthew G. Knepley #include <petsc/private/petscimpl.h> 6d6685f55SMatthew G. Knepley 7d6685f55SMatthew G. Knepley const char *const DTProbDensityTypes[] = {"constant", "gaussian", "maxwell_boltzmann", "DTProb Density", "DTPROB_DENSITY_", NULL}; 8d6685f55SMatthew G. Knepley 9d6685f55SMatthew G. Knepley /*@ 10d6685f55SMatthew G. Knepley PetscPDFMaxwellBoltzmann1D - PDF for the Maxwell-Boltzmann distribution in 1D 11d6685f55SMatthew G. Knepley 1220f4b53cSBarry Smith Not Collective 13d6685f55SMatthew G. Knepley 14a4e35b19SJacob Faibussowitsch Input Parameters: 151d27aa22SBarry Smith + x - Speed in $[0, \infty]$ 16*2a8381b2SBarry Smith - unused - Unused 17d6685f55SMatthew G. Knepley 18d6685f55SMatthew G. Knepley Output Parameter: 191d27aa22SBarry Smith . p - The probability density at `x` 20d6685f55SMatthew G. Knepley 21d6685f55SMatthew G. Knepley Level: beginner 22d6685f55SMatthew G. Knepley 23dce8aebaSBarry Smith .seealso: `PetscCDFMaxwellBoltzmann1D()` 24d6685f55SMatthew G. Knepley @*/ 25*2a8381b2SBarry Smith PetscErrorCode PetscPDFMaxwellBoltzmann1D(const PetscReal x[], const PetscReal unused[], PetscReal p[]) 26d71ae5a4SJacob Faibussowitsch { 27d6685f55SMatthew G. Knepley p[0] = PetscSqrtReal(2. / PETSC_PI) * PetscExpReal(-0.5 * PetscSqr(x[0])); 283ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 29d6685f55SMatthew G. Knepley } 30d6685f55SMatthew G. Knepley 31d6685f55SMatthew G. Knepley /*@ 32d6685f55SMatthew G. Knepley PetscCDFMaxwellBoltzmann1D - CDF for the Maxwell-Boltzmann distribution in 1D 33d6685f55SMatthew G. Knepley 3420f4b53cSBarry Smith Not Collective 35d6685f55SMatthew G. Knepley 36a4e35b19SJacob Faibussowitsch Input Parameters: 371d27aa22SBarry Smith + x - Speed in $[0, \infty]$ 38*2a8381b2SBarry Smith - unused - Unused 39d6685f55SMatthew G. Knepley 40d6685f55SMatthew G. Knepley Output Parameter: 411d27aa22SBarry Smith . p - The probability density at `x` 42d6685f55SMatthew G. Knepley 43d6685f55SMatthew G. Knepley Level: beginner 44d6685f55SMatthew G. Knepley 45dce8aebaSBarry Smith .seealso: `PetscPDFMaxwellBoltzmann1D()` 46d6685f55SMatthew G. Knepley @*/ 47*2a8381b2SBarry Smith PetscErrorCode PetscCDFMaxwellBoltzmann1D(const PetscReal x[], const PetscReal unused[], PetscReal p[]) 48d71ae5a4SJacob Faibussowitsch { 49d6685f55SMatthew G. Knepley p[0] = PetscErfReal(x[0] / PETSC_SQRT2); 503ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 51d6685f55SMatthew G. Knepley } 52d6685f55SMatthew G. Knepley 53d6685f55SMatthew G. Knepley /*@ 54d6685f55SMatthew G. Knepley PetscPDFMaxwellBoltzmann2D - PDF for the Maxwell-Boltzmann distribution in 2D 55d6685f55SMatthew G. Knepley 5620f4b53cSBarry Smith Not Collective 57d6685f55SMatthew G. Knepley 58a4e35b19SJacob Faibussowitsch Input Parameters: 591d27aa22SBarry Smith + x - Speed in $[0, \infty]$ 60*2a8381b2SBarry Smith - unused - Unused 61d6685f55SMatthew G. Knepley 62d6685f55SMatthew G. Knepley Output Parameter: 631d27aa22SBarry Smith . p - The probability density at `x` 64d6685f55SMatthew G. Knepley 65d6685f55SMatthew G. Knepley Level: beginner 66d6685f55SMatthew G. Knepley 67dce8aebaSBarry Smith .seealso: `PetscCDFMaxwellBoltzmann2D()` 68d6685f55SMatthew G. Knepley @*/ 69*2a8381b2SBarry Smith PetscErrorCode PetscPDFMaxwellBoltzmann2D(const PetscReal x[], const PetscReal unused[], PetscReal p[]) 70d71ae5a4SJacob Faibussowitsch { 71d6685f55SMatthew G. Knepley p[0] = x[0] * PetscExpReal(-0.5 * PetscSqr(x[0])); 723ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 73d6685f55SMatthew G. Knepley } 74d6685f55SMatthew G. Knepley 75d6685f55SMatthew G. Knepley /*@ 76d6685f55SMatthew G. Knepley PetscCDFMaxwellBoltzmann2D - CDF for the Maxwell-Boltzmann distribution in 2D 77d6685f55SMatthew G. Knepley 7820f4b53cSBarry Smith Not Collective 79d6685f55SMatthew G. Knepley 80a4e35b19SJacob Faibussowitsch Input Parameters: 811d27aa22SBarry Smith + x - Speed in $[0, \infty]$ 82*2a8381b2SBarry Smith - unused - Unused 83d6685f55SMatthew G. Knepley 84d6685f55SMatthew G. Knepley Output Parameter: 851d27aa22SBarry Smith . p - The probability density at `x` 86d6685f55SMatthew G. Knepley 87d6685f55SMatthew G. Knepley Level: beginner 88d6685f55SMatthew G. Knepley 89dce8aebaSBarry Smith .seealso: `PetscPDFMaxwellBoltzmann2D()` 90d6685f55SMatthew G. Knepley @*/ 91*2a8381b2SBarry Smith PetscErrorCode PetscCDFMaxwellBoltzmann2D(const PetscReal x[], const PetscReal unused[], PetscReal p[]) 92d71ae5a4SJacob Faibussowitsch { 93d6685f55SMatthew G. Knepley p[0] = 1. - PetscExpReal(-0.5 * PetscSqr(x[0])); 943ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 95d6685f55SMatthew G. Knepley } 96d6685f55SMatthew G. Knepley 97d6685f55SMatthew G. Knepley /*@ 98d6685f55SMatthew G. Knepley PetscPDFMaxwellBoltzmann3D - PDF for the Maxwell-Boltzmann distribution in 3D 99d6685f55SMatthew G. Knepley 10020f4b53cSBarry Smith Not Collective 101d6685f55SMatthew G. Knepley 102a4e35b19SJacob Faibussowitsch Input Parameters: 1031d27aa22SBarry Smith + x - Speed in $[0, \infty]$ 104*2a8381b2SBarry Smith - unused - Unused 105d6685f55SMatthew G. Knepley 106d6685f55SMatthew G. Knepley Output Parameter: 1071d27aa22SBarry Smith . p - The probability density at `x` 108d6685f55SMatthew G. Knepley 109d6685f55SMatthew G. Knepley Level: beginner 110d6685f55SMatthew G. Knepley 111dce8aebaSBarry Smith .seealso: `PetscCDFMaxwellBoltzmann3D()` 112d6685f55SMatthew G. Knepley @*/ 113*2a8381b2SBarry Smith PetscErrorCode PetscPDFMaxwellBoltzmann3D(const PetscReal x[], const PetscReal unused[], PetscReal p[]) 114d71ae5a4SJacob Faibussowitsch { 115d6685f55SMatthew G. Knepley p[0] = PetscSqrtReal(2. / PETSC_PI) * PetscSqr(x[0]) * PetscExpReal(-0.5 * PetscSqr(x[0])); 1163ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 117d6685f55SMatthew G. Knepley } 118d6685f55SMatthew G. Knepley 119d6685f55SMatthew G. Knepley /*@ 120d6685f55SMatthew G. Knepley PetscCDFMaxwellBoltzmann3D - CDF for the Maxwell-Boltzmann distribution in 3D 121d6685f55SMatthew G. Knepley 12220f4b53cSBarry Smith Not Collective 123d6685f55SMatthew G. Knepley 124a4e35b19SJacob Faibussowitsch Input Parameters: 1251d27aa22SBarry Smith + x - Speed in $[0, \infty]$ 126*2a8381b2SBarry Smith - unused - Unused 127d6685f55SMatthew G. Knepley 128d6685f55SMatthew G. Knepley Output Parameter: 1291d27aa22SBarry Smith . p - The probability density at `x` 130d6685f55SMatthew G. Knepley 131d6685f55SMatthew G. Knepley Level: beginner 132d6685f55SMatthew G. Knepley 133dce8aebaSBarry Smith .seealso: `PetscPDFMaxwellBoltzmann3D()` 134d6685f55SMatthew G. Knepley @*/ 135*2a8381b2SBarry Smith PetscErrorCode PetscCDFMaxwellBoltzmann3D(const PetscReal x[], const PetscReal unused[], PetscReal p[]) 136d71ae5a4SJacob Faibussowitsch { 137d6685f55SMatthew G. Knepley p[0] = PetscErfReal(x[0] / PETSC_SQRT2) - PetscSqrtReal(2. / PETSC_PI) * x[0] * PetscExpReal(-0.5 * PetscSqr(x[0])); 1383ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 139d6685f55SMatthew G. Knepley } 140d6685f55SMatthew G. Knepley 141d6685f55SMatthew G. Knepley /*@ 142d6685f55SMatthew G. Knepley PetscPDFGaussian1D - PDF for the Gaussian distribution in 1D 143d6685f55SMatthew G. Knepley 14420f4b53cSBarry Smith Not Collective 145d6685f55SMatthew G. Knepley 146a4e35b19SJacob Faibussowitsch Input Parameters: 1471d27aa22SBarry Smith + x - Coordinate in $[-\infty, \infty]$ 148a4e35b19SJacob Faibussowitsch - scale - Scaling value 149d6685f55SMatthew G. Knepley 150d6685f55SMatthew G. Knepley Output Parameter: 1511d27aa22SBarry Smith . p - The probability density at `x` 152d6685f55SMatthew G. Knepley 153d6685f55SMatthew G. Knepley Level: beginner 154d6685f55SMatthew G. Knepley 155dce8aebaSBarry Smith .seealso: `PetscPDFMaxwellBoltzmann3D()` 156d6685f55SMatthew G. Knepley @*/ 157d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscPDFGaussian1D(const PetscReal x[], const PetscReal scale[], PetscReal p[]) 158d71ae5a4SJacob Faibussowitsch { 159d6685f55SMatthew G. Knepley const PetscReal sigma = scale ? scale[0] : 1.; 160d6685f55SMatthew G. Knepley p[0] = PetscSqrtReal(1. / (2. * PETSC_PI)) * PetscExpReal(-0.5 * PetscSqr(x[0] / sigma)) / sigma; 1613ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 162d6685f55SMatthew G. Knepley } 163d6685f55SMatthew G. Knepley 164d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscCDFGaussian1D(const PetscReal x[], const PetscReal scale[], PetscReal p[]) 165d71ae5a4SJacob Faibussowitsch { 166d6685f55SMatthew G. Knepley const PetscReal sigma = scale ? scale[0] : 1.; 167d6685f55SMatthew G. Knepley p[0] = 0.5 * (1. + PetscErfReal(x[0] / PETSC_SQRT2 / sigma)); 1683ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 169d6685f55SMatthew G. Knepley } 170d6685f55SMatthew G. Knepley 171d6685f55SMatthew G. Knepley /*@ 172d6685f55SMatthew G. Knepley PetscPDFSampleGaussian1D - Sample uniformly from a Gaussian distribution in 1D 173d6685f55SMatthew G. Knepley 17420f4b53cSBarry Smith Not Collective 175d6685f55SMatthew G. Knepley 176817da375SSatish Balay Input Parameters: 1771d27aa22SBarry Smith + p - A uniform variable on $[0, 1]$ 178*2a8381b2SBarry Smith - unused - ignored 179d6685f55SMatthew G. Knepley 180d6685f55SMatthew G. Knepley Output Parameter: 1811d27aa22SBarry Smith . x - Coordinate in $[-\infty, \infty]$ 182d6685f55SMatthew G. Knepley 183d6685f55SMatthew G. Knepley Level: beginner 184d6685f55SMatthew G. Knepley 1851d27aa22SBarry Smith Note: 1861d27aa22SBarry Smith See <http://www.mimirgames.com/articles/programming/approximations-of-the-inverse-error-function> and 1871d27aa22SBarry Smith <https://stackoverflow.com/questions/27229371/inverse-error-function-in-c> 188a4e35b19SJacob Faibussowitsch 189a4e35b19SJacob Faibussowitsch .seealso: `PetscPDFGaussian2D()` 190d6685f55SMatthew G. Knepley @*/ 191*2a8381b2SBarry Smith PetscErrorCode PetscPDFSampleGaussian1D(const PetscReal p[], const PetscReal unused[], PetscReal x[]) 192d71ae5a4SJacob Faibussowitsch { 193d6685f55SMatthew G. Knepley const PetscReal q = 2 * p[0] - 1.; 194d6685f55SMatthew G. Knepley const PetscInt maxIter = 100; 195d6685f55SMatthew G. Knepley PetscReal ck[100], r = 0.; 196d6685f55SMatthew G. Knepley PetscInt k, m; 197d6685f55SMatthew G. Knepley 198d6685f55SMatthew G. Knepley PetscFunctionBeginHot; 199d6685f55SMatthew G. Knepley /* Transform input to [-1, 1] since the code below computes the inverse error function */ 200d6685f55SMatthew G. Knepley for (k = 0; k < maxIter; ++k) ck[k] = 0.; 201d6685f55SMatthew G. Knepley ck[0] = 1; 202d6685f55SMatthew G. Knepley r = ck[0] * (PetscSqrtReal(PETSC_PI) / 2.) * q; 203d6685f55SMatthew G. Knepley for (k = 1; k < maxIter; ++k) { 204d6685f55SMatthew G. Knepley const PetscReal temp = 2. * k + 1.; 205d6685f55SMatthew G. Knepley 206d6685f55SMatthew G. Knepley for (m = 0; m <= k - 1; ++m) { 207d6685f55SMatthew G. Knepley PetscReal denom = (m + 1.) * (2. * m + 1.); 208d6685f55SMatthew G. Knepley 209d6685f55SMatthew G. Knepley ck[k] += (ck[m] * ck[k - 1 - m]) / denom; 210d6685f55SMatthew G. Knepley } 211d6685f55SMatthew G. Knepley r += (ck[k] / temp) * PetscPowReal((PetscSqrtReal(PETSC_PI) / 2.) * q, 2. * k + 1.); 212d6685f55SMatthew G. Knepley } 213d6685f55SMatthew G. Knepley /* Scale erfinv() by \sqrt{\pi/2} */ 214d6685f55SMatthew G. Knepley x[0] = PetscSqrtReal(PETSC_PI * 0.5) * r; 2153ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 216d6685f55SMatthew G. Knepley } 217d6685f55SMatthew G. Knepley 218d6685f55SMatthew G. Knepley /*@ 219d6685f55SMatthew G. Knepley PetscPDFGaussian2D - PDF for the Gaussian distribution in 2D 220d6685f55SMatthew G. Knepley 22120f4b53cSBarry Smith Not Collective 222d6685f55SMatthew G. Knepley 223817da375SSatish Balay Input Parameters: 2241d27aa22SBarry Smith + x - Coordinate in $[-\infty, \infty]^2$ 225*2a8381b2SBarry Smith - unused - ignored 226d6685f55SMatthew G. Knepley 227d6685f55SMatthew G. Knepley Output Parameter: 2281d27aa22SBarry Smith . p - The probability density at `x` 229d6685f55SMatthew G. Knepley 230d6685f55SMatthew G. Knepley Level: beginner 231d6685f55SMatthew G. Knepley 232db781477SPatrick Sanan .seealso: `PetscPDFSampleGaussian2D()`, `PetscPDFMaxwellBoltzmann3D()` 233d6685f55SMatthew G. Knepley @*/ 234*2a8381b2SBarry Smith PetscErrorCode PetscPDFGaussian2D(const PetscReal x[], const PetscReal unused[], PetscReal p[]) 235d71ae5a4SJacob Faibussowitsch { 236d6685f55SMatthew G. Knepley p[0] = (1. / PETSC_PI) * PetscExpReal(-0.5 * (PetscSqr(x[0]) + PetscSqr(x[1]))); 2373ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 238d6685f55SMatthew G. Knepley } 239d6685f55SMatthew G. Knepley 240d6685f55SMatthew G. Knepley /*@ 241d6685f55SMatthew G. Knepley PetscPDFSampleGaussian2D - Sample uniformly from a Gaussian distribution in 2D 2421d27aa22SBarry Smith <https://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform> 243d6685f55SMatthew G. Knepley 24420f4b53cSBarry Smith Not Collective 245d6685f55SMatthew G. Knepley 246817da375SSatish Balay Input Parameters: 2471d27aa22SBarry Smith + p - A uniform variable on $[0, 1]^2$ 248*2a8381b2SBarry Smith - unused - ignored 249d6685f55SMatthew G. Knepley 250d6685f55SMatthew G. Knepley Output Parameter: 2511d27aa22SBarry Smith . x - Coordinate in $[-\infty, \infty]^2 $ 252d6685f55SMatthew G. Knepley 253d6685f55SMatthew G. Knepley Level: beginner 254d6685f55SMatthew G. Knepley 255db781477SPatrick Sanan .seealso: `PetscPDFGaussian2D()`, `PetscPDFMaxwellBoltzmann3D()` 256d6685f55SMatthew G. Knepley @*/ 257*2a8381b2SBarry Smith PetscErrorCode PetscPDFSampleGaussian2D(const PetscReal p[], const PetscReal unused[], PetscReal x[]) 258d71ae5a4SJacob Faibussowitsch { 259d6685f55SMatthew G. Knepley const PetscReal mag = PetscSqrtReal(-2.0 * PetscLogReal(p[0])); 260d6685f55SMatthew G. Knepley x[0] = mag * PetscCosReal(2.0 * PETSC_PI * p[1]); 261d6685f55SMatthew G. Knepley x[1] = mag * PetscSinReal(2.0 * PETSC_PI * p[1]); 2623ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 263d6685f55SMatthew G. Knepley } 264d6685f55SMatthew G. Knepley 265d6685f55SMatthew G. Knepley /*@ 266ea1b28ebSMatthew G. Knepley PetscPDFGaussian3D - PDF for the Gaussian distribution in 3D 267ea1b28ebSMatthew G. Knepley 26820f4b53cSBarry Smith Not Collective 269ea1b28ebSMatthew G. Knepley 270ea1b28ebSMatthew G. Knepley Input Parameters: 2711d27aa22SBarry Smith + x - Coordinate in $[-\infty, \infty]^3$ 272*2a8381b2SBarry Smith - unused - ignored 273ea1b28ebSMatthew G. Knepley 274ea1b28ebSMatthew G. Knepley Output Parameter: 2751d27aa22SBarry Smith . p - The probability density at `x` 276ea1b28ebSMatthew G. Knepley 277ea1b28ebSMatthew G. Knepley Level: beginner 278ea1b28ebSMatthew G. Knepley 279db781477SPatrick Sanan .seealso: `PetscPDFSampleGaussian3D()`, `PetscPDFMaxwellBoltzmann3D()` 280ea1b28ebSMatthew G. Knepley @*/ 281*2a8381b2SBarry Smith PetscErrorCode PetscPDFGaussian3D(const PetscReal x[], const PetscReal unused[], PetscReal p[]) 282d71ae5a4SJacob Faibussowitsch { 283ea1b28ebSMatthew G. Knepley p[0] = (1. / PETSC_PI * PetscSqrtReal(PETSC_PI)) * PetscExpReal(-0.5 * (PetscSqr(x[0]) + PetscSqr(x[1]) + PetscSqr(x[2]))); 2843ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 285ea1b28ebSMatthew G. Knepley } 286ea1b28ebSMatthew G. Knepley 287ea1b28ebSMatthew G. Knepley /*@ 288ea1b28ebSMatthew G. Knepley PetscPDFSampleGaussian3D - Sample uniformly from a Gaussian distribution in 3D 2891d27aa22SBarry Smith <https://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform> 290ea1b28ebSMatthew G. Knepley 29120f4b53cSBarry Smith Not Collective 292ea1b28ebSMatthew G. Knepley 293ea1b28ebSMatthew G. Knepley Input Parameters: 2941d27aa22SBarry Smith + p - A uniform variable on $[0, 1]^3$ 295*2a8381b2SBarry Smith - unused - ignored 296ea1b28ebSMatthew G. Knepley 297ea1b28ebSMatthew G. Knepley Output Parameter: 2981d27aa22SBarry Smith . x - Coordinate in $[-\infty, \infty]^3$ 299ea1b28ebSMatthew G. Knepley 300ea1b28ebSMatthew G. Knepley Level: beginner 301ea1b28ebSMatthew G. Knepley 302db781477SPatrick Sanan .seealso: `PetscPDFGaussian3D()`, `PetscPDFMaxwellBoltzmann3D()` 303ea1b28ebSMatthew G. Knepley @*/ 304*2a8381b2SBarry Smith PetscErrorCode PetscPDFSampleGaussian3D(const PetscReal p[], const PetscReal unused[], PetscReal x[]) 305d71ae5a4SJacob Faibussowitsch { 306*2a8381b2SBarry Smith PetscCall(PetscPDFSampleGaussian1D(p, unused, x)); 307*2a8381b2SBarry Smith PetscCall(PetscPDFSampleGaussian2D(&p[1], unused, &x[1])); 3083ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 309ea1b28ebSMatthew G. Knepley } 310ea1b28ebSMatthew G. Knepley 311ea1b28ebSMatthew G. Knepley /*@ 312d6685f55SMatthew G. Knepley PetscPDFConstant1D - PDF for the uniform distribution in 1D 313d6685f55SMatthew G. Knepley 31420f4b53cSBarry Smith Not Collective 315d6685f55SMatthew G. Knepley 316a4e35b19SJacob Faibussowitsch Input Parameters: 3171d27aa22SBarry Smith + x - Coordinate in $[-1, 1]$ 318*2a8381b2SBarry Smith - unused - Unused 319d6685f55SMatthew G. Knepley 320d6685f55SMatthew G. Knepley Output Parameter: 3211d27aa22SBarry Smith . p - The probability density at `x` 322d6685f55SMatthew G. Knepley 323d6685f55SMatthew G. Knepley Level: beginner 324d6685f55SMatthew G. Knepley 325db781477SPatrick Sanan .seealso: `PetscCDFConstant1D()`, `PetscPDFSampleConstant1D()`, `PetscPDFConstant2D()`, `PetscPDFConstant3D()` 326d6685f55SMatthew G. Knepley @*/ 327*2a8381b2SBarry Smith PetscErrorCode PetscPDFConstant1D(const PetscReal x[], const PetscReal unused[], PetscReal p[]) 328d71ae5a4SJacob Faibussowitsch { 329d6685f55SMatthew G. Knepley p[0] = x[0] > -1. && x[0] <= 1. ? 0.5 : 0.; 3303ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 331d6685f55SMatthew G. Knepley } 332d6685f55SMatthew G. Knepley 333ea1b28ebSMatthew G. Knepley /*@ 334ea1b28ebSMatthew G. Knepley PetscCDFConstant1D - CDF for the uniform distribution in 1D 335ea1b28ebSMatthew G. Knepley 33620f4b53cSBarry Smith Not Collective 337ea1b28ebSMatthew G. Knepley 338a4e35b19SJacob Faibussowitsch Input Parameters: 3391d27aa22SBarry Smith + x - Coordinate in $[-1, 1]$ 340*2a8381b2SBarry Smith - unused - Unused 341ea1b28ebSMatthew G. Knepley 342ea1b28ebSMatthew G. Knepley Output Parameter: 3431d27aa22SBarry Smith . p - The cumulative probability at `x` 344ea1b28ebSMatthew G. Knepley 345ea1b28ebSMatthew G. Knepley Level: beginner 346ea1b28ebSMatthew G. Knepley 347db781477SPatrick Sanan .seealso: `PetscPDFConstant1D()`, `PetscPDFSampleConstant1D()`, `PetscCDFConstant2D()`, `PetscCDFConstant3D()` 348ea1b28ebSMatthew G. Knepley @*/ 349*2a8381b2SBarry Smith PetscErrorCode PetscCDFConstant1D(const PetscReal x[], const PetscReal unused[], PetscReal p[]) 350d71ae5a4SJacob Faibussowitsch { 351d6685f55SMatthew G. Knepley p[0] = x[0] <= -1. ? 0. : (x[0] > 1. ? 1. : 0.5 * (x[0] + 1.)); 3523ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 353d6685f55SMatthew G. Knepley } 354d6685f55SMatthew G. Knepley 355d6685f55SMatthew G. Knepley /*@ 356d6685f55SMatthew G. Knepley PetscPDFSampleConstant1D - Sample uniformly from a uniform distribution on [-1, 1] in 1D 357d6685f55SMatthew G. Knepley 35820f4b53cSBarry Smith Not Collective 359d6685f55SMatthew G. Knepley 360a4e35b19SJacob Faibussowitsch Input Parameters: 3611d27aa22SBarry Smith + p - A uniform variable on $[0, 1]$ 362*2a8381b2SBarry Smith - unused - Unused 363d6685f55SMatthew G. Knepley 364d6685f55SMatthew G. Knepley Output Parameter: 3651d27aa22SBarry Smith . x - Coordinate in $[-1, 1]$ 366d6685f55SMatthew G. Knepley 367d6685f55SMatthew G. Knepley Level: beginner 368d6685f55SMatthew G. Knepley 369db781477SPatrick Sanan .seealso: `PetscPDFConstant1D()`, `PetscCDFConstant1D()`, `PetscPDFSampleConstant2D()`, `PetscPDFSampleConstant3D()` 370d6685f55SMatthew G. Knepley @*/ 371*2a8381b2SBarry Smith PetscErrorCode PetscPDFSampleConstant1D(const PetscReal p[], const PetscReal unused[], PetscReal x[]) 372d71ae5a4SJacob Faibussowitsch { 373ea1b28ebSMatthew G. Knepley x[0] = 2. * p[0] - 1.; 3743ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 375ea1b28ebSMatthew G. Knepley } 376ea1b28ebSMatthew G. Knepley 377ea1b28ebSMatthew G. Knepley /*@ 378ea1b28ebSMatthew G. Knepley PetscPDFConstant2D - PDF for the uniform distribution in 2D 379ea1b28ebSMatthew G. Knepley 38020f4b53cSBarry Smith Not Collective 381ea1b28ebSMatthew G. Knepley 382a4e35b19SJacob Faibussowitsch Input Parameters: 3831d27aa22SBarry Smith + x - Coordinate in $[-1, 1]^2$ 384*2a8381b2SBarry Smith - unused - Unused 385ea1b28ebSMatthew G. Knepley 386ea1b28ebSMatthew G. Knepley Output Parameter: 3871d27aa22SBarry Smith . p - The probability density at `x` 388ea1b28ebSMatthew G. Knepley 389ea1b28ebSMatthew G. Knepley Level: beginner 390ea1b28ebSMatthew G. Knepley 391db781477SPatrick Sanan .seealso: `PetscCDFConstant2D()`, `PetscPDFSampleConstant2D()`, `PetscPDFConstant1D()`, `PetscPDFConstant3D()` 392ea1b28ebSMatthew G. Knepley @*/ 393*2a8381b2SBarry Smith PetscErrorCode PetscPDFConstant2D(const PetscReal x[], const PetscReal unused[], PetscReal p[]) 394d71ae5a4SJacob Faibussowitsch { 395ea1b28ebSMatthew G. Knepley p[0] = x[0] > -1. && x[0] <= 1. && x[1] > -1. && x[1] <= 1. ? 0.25 : 0.; 3963ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 397ea1b28ebSMatthew G. Knepley } 398ea1b28ebSMatthew G. Knepley 399ea1b28ebSMatthew G. Knepley /*@ 400ea1b28ebSMatthew G. Knepley PetscCDFConstant2D - CDF for the uniform distribution in 2D 401ea1b28ebSMatthew G. Knepley 40220f4b53cSBarry Smith Not Collective 403ea1b28ebSMatthew G. Knepley 404a4e35b19SJacob Faibussowitsch Input Parameters: 4051d27aa22SBarry Smith + x - Coordinate in $[-1, 1]^2$ 406*2a8381b2SBarry Smith - unused - Unused 407ea1b28ebSMatthew G. Knepley 408ea1b28ebSMatthew G. Knepley Output Parameter: 4091d27aa22SBarry Smith . p - The cumulative probability at `x` 410ea1b28ebSMatthew G. Knepley 411ea1b28ebSMatthew G. Knepley Level: beginner 412ea1b28ebSMatthew G. Knepley 413db781477SPatrick Sanan .seealso: `PetscPDFConstant2D()`, `PetscPDFSampleConstant2D()`, `PetscCDFConstant1D()`, `PetscCDFConstant3D()` 414ea1b28ebSMatthew G. Knepley @*/ 415*2a8381b2SBarry Smith PetscErrorCode PetscCDFConstant2D(const PetscReal x[], const PetscReal unused[], PetscReal p[]) 416d71ae5a4SJacob Faibussowitsch { 417ea1b28ebSMatthew G. Knepley p[0] = x[0] <= -1. || x[1] <= -1. ? 0. : (x[0] > 1. ? 1. : 0.5 * (x[0] + 1.)) * (x[1] > 1. ? 1. : 0.5 * (x[1] + 1.)); 4183ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 419ea1b28ebSMatthew G. Knepley } 420ea1b28ebSMatthew G. Knepley 421ea1b28ebSMatthew G. Knepley /*@ 4221d27aa22SBarry Smith PetscPDFSampleConstant2D - Sample uniformly from a uniform distribution on $[-1, 1]^2$ in 2D 423ea1b28ebSMatthew G. Knepley 42420f4b53cSBarry Smith Not Collective 425ea1b28ebSMatthew G. Knepley 426a4e35b19SJacob Faibussowitsch Input Parameters: 4271d27aa22SBarry Smith + p - Two uniform variables on $[0, 1]$ 428*2a8381b2SBarry Smith - unused - Unused 429ea1b28ebSMatthew G. Knepley 430ea1b28ebSMatthew G. Knepley Output Parameter: 4311d27aa22SBarry Smith . x - Coordinate in $[-1, 1]^2$ 432ea1b28ebSMatthew G. Knepley 433ea1b28ebSMatthew G. Knepley Level: beginner 434ea1b28ebSMatthew G. Knepley 435db781477SPatrick Sanan .seealso: `PetscPDFConstant2D()`, `PetscCDFConstant2D()`, `PetscPDFSampleConstant1D()`, `PetscPDFSampleConstant3D()` 436ea1b28ebSMatthew G. Knepley @*/ 437*2a8381b2SBarry Smith PetscErrorCode PetscPDFSampleConstant2D(const PetscReal p[], const PetscReal unused[], PetscReal x[]) 438d71ae5a4SJacob Faibussowitsch { 439ea1b28ebSMatthew G. Knepley x[0] = 2. * p[0] - 1.; 440ea1b28ebSMatthew G. Knepley x[1] = 2. * p[1] - 1.; 4413ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 442ea1b28ebSMatthew G. Knepley } 443ea1b28ebSMatthew G. Knepley 444ea1b28ebSMatthew G. Knepley /*@ 445ea1b28ebSMatthew G. Knepley PetscPDFConstant3D - PDF for the uniform distribution in 3D 446ea1b28ebSMatthew G. Knepley 44720f4b53cSBarry Smith Not Collective 448ea1b28ebSMatthew G. Knepley 449a4e35b19SJacob Faibussowitsch Input Parameters: 4501d27aa22SBarry Smith + x - Coordinate in $[-1, 1]^3$ 451*2a8381b2SBarry Smith - unused - Unused 452ea1b28ebSMatthew G. Knepley 453ea1b28ebSMatthew G. Knepley Output Parameter: 4541d27aa22SBarry Smith . p - The probability density at `x` 455ea1b28ebSMatthew G. Knepley 456ea1b28ebSMatthew G. Knepley Level: beginner 457ea1b28ebSMatthew G. Knepley 458db781477SPatrick Sanan .seealso: `PetscCDFConstant3D()`, `PetscPDFSampleConstant3D()`, `PetscPDFSampleConstant1D()`, `PetscPDFSampleConstant2D()` 459ea1b28ebSMatthew G. Knepley @*/ 460*2a8381b2SBarry Smith PetscErrorCode PetscPDFConstant3D(const PetscReal x[], const PetscReal unused[], PetscReal p[]) 461d71ae5a4SJacob Faibussowitsch { 462ea1b28ebSMatthew G. Knepley p[0] = x[0] > -1. && x[0] <= 1. && x[1] > -1. && x[1] <= 1. && x[2] > -1. && x[2] <= 1. ? 0.125 : 0.; 4633ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 464ea1b28ebSMatthew G. Knepley } 465ea1b28ebSMatthew G. Knepley 466ea1b28ebSMatthew G. Knepley /*@ 467ea1b28ebSMatthew G. Knepley PetscCDFConstant3D - CDF for the uniform distribution in 3D 468ea1b28ebSMatthew G. Knepley 46920f4b53cSBarry Smith Not Collective 470ea1b28ebSMatthew G. Knepley 471a4e35b19SJacob Faibussowitsch Input Parameters: 4721d27aa22SBarry Smith + x - Coordinate in $[-1, 1]^3$ 473*2a8381b2SBarry Smith - unused - Unused 474ea1b28ebSMatthew G. Knepley 475ea1b28ebSMatthew G. Knepley Output Parameter: 4761d27aa22SBarry Smith . p - The cumulative probability at `x` 477ea1b28ebSMatthew G. Knepley 478ea1b28ebSMatthew G. Knepley Level: beginner 479ea1b28ebSMatthew G. Knepley 480db781477SPatrick Sanan .seealso: `PetscPDFConstant3D()`, `PetscPDFSampleConstant3D()`, `PetscCDFConstant1D()`, `PetscCDFConstant2D()` 481ea1b28ebSMatthew G. Knepley @*/ 482*2a8381b2SBarry Smith PetscErrorCode PetscCDFConstant3D(const PetscReal x[], const PetscReal unused[], PetscReal p[]) 483d71ae5a4SJacob Faibussowitsch { 484ea1b28ebSMatthew G. Knepley p[0] = x[0] <= -1. || x[1] <= -1. || x[2] <= -1. ? 0. : (x[0] > 1. ? 1. : 0.5 * (x[0] + 1.)) * (x[1] > 1. ? 1. : 0.5 * (x[1] + 1.)) * (x[2] > 1. ? 1. : 0.5 * (x[2] + 1.)); 4853ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 486ea1b28ebSMatthew G. Knepley } 487ea1b28ebSMatthew G. Knepley 488ea1b28ebSMatthew G. Knepley /*@ 4891d27aa22SBarry Smith PetscPDFSampleConstant3D - Sample uniformly from a uniform distribution on $[-1, 1]^3$ in 3D 490ea1b28ebSMatthew G. Knepley 49120f4b53cSBarry Smith Not Collective 492ea1b28ebSMatthew G. Knepley 493a4e35b19SJacob Faibussowitsch Input Parameters: 4941d27aa22SBarry Smith + p - Three uniform variables on $[0, 1]$ 495*2a8381b2SBarry Smith - unused - Unused 496ea1b28ebSMatthew G. Knepley 497ea1b28ebSMatthew G. Knepley Output Parameter: 4981d27aa22SBarry Smith . x - Coordinate in $[-1, 1]^3$ 499ea1b28ebSMatthew G. Knepley 500ea1b28ebSMatthew G. Knepley Level: beginner 501ea1b28ebSMatthew G. Knepley 502db781477SPatrick Sanan .seealso: `PetscPDFConstant3D()`, `PetscCDFConstant3D()`, `PetscPDFSampleConstant1D()`, `PetscPDFSampleConstant2D()` 503ea1b28ebSMatthew G. Knepley @*/ 504*2a8381b2SBarry Smith PetscErrorCode PetscPDFSampleConstant3D(const PetscReal p[], const PetscReal unused[], PetscReal x[]) 505d71ae5a4SJacob Faibussowitsch { 506ea1b28ebSMatthew G. Knepley x[0] = 2. * p[0] - 1.; 507ea1b28ebSMatthew G. Knepley x[1] = 2. * p[1] - 1.; 508ea1b28ebSMatthew G. Knepley x[2] = 2. * p[2] - 1.; 5093ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 510d6685f55SMatthew G. Knepley } 511d6685f55SMatthew G. Knepley 512d6685f55SMatthew G. Knepley /*@C 513da81f932SPierre Jolivet PetscProbCreateFromOptions - Return the probability distribution specified by the arguments and options 514d6685f55SMatthew G. Knepley 51520f4b53cSBarry Smith Not Collective 516d6685f55SMatthew G. Knepley 517d6685f55SMatthew G. Knepley Input Parameters: 518d6685f55SMatthew G. Knepley + dim - The dimension of sample points 5191d27aa22SBarry Smith . prefix - The options prefix, or `NULL` 520f13dfd9eSBarry Smith - name - The options database name for the probability distribution type 521d6685f55SMatthew G. Knepley 522d6685f55SMatthew G. Knepley Output Parameters: 523f13dfd9eSBarry Smith + pdf - The PDF of this type, or `NULL` 524f13dfd9eSBarry Smith . cdf - The CDF of this type, or `NULL` 525f13dfd9eSBarry Smith - sampler - The PDF sampler of this type, or `NULL` 526d6685f55SMatthew G. Knepley 527d6685f55SMatthew G. Knepley Level: intermediate 528d6685f55SMatthew G. Knepley 529f8662bd6SBarry Smith .seealso: `PetscProbFn`, `PetscPDFMaxwellBoltzmann1D()`, `PetscPDFGaussian1D()`, `PetscPDFConstant1D()` 530d6685f55SMatthew G. Knepley @*/ 531f8662bd6SBarry Smith PetscErrorCode PetscProbCreateFromOptions(PetscInt dim, const char prefix[], const char name[], PetscProbFn **pdf, PetscProbFn **cdf, PetscProbFn **sampler) 532d71ae5a4SJacob Faibussowitsch { 533d6685f55SMatthew G. Knepley DTProbDensityType den = DTPROB_DENSITY_GAUSSIAN; 534d6685f55SMatthew G. Knepley 535d6685f55SMatthew G. Knepley PetscFunctionBegin; 536d0609cedSBarry Smith PetscOptionsBegin(PETSC_COMM_SELF, prefix, "PetscProb Options", "DT"); 5379566063dSJacob Faibussowitsch PetscCall(PetscOptionsEnum(name, "Method to compute PDF <constant, gaussian>", "", DTProbDensityTypes, (PetscEnum)den, (PetscEnum *)&den, NULL)); 538d0609cedSBarry Smith PetscOptionsEnd(); 539d6685f55SMatthew G. Knepley 5409371c9d4SSatish Balay if (pdf) { 5414f572ea9SToby Isaac PetscAssertPointer(pdf, 4); 5429371c9d4SSatish Balay *pdf = NULL; 5439371c9d4SSatish Balay } 5449371c9d4SSatish Balay if (cdf) { 5454f572ea9SToby Isaac PetscAssertPointer(cdf, 5); 5469371c9d4SSatish Balay *cdf = NULL; 5479371c9d4SSatish Balay } 5489371c9d4SSatish Balay if (sampler) { 5494f572ea9SToby Isaac PetscAssertPointer(sampler, 6); 5509371c9d4SSatish Balay *sampler = NULL; 5519371c9d4SSatish Balay } 552d6685f55SMatthew G. Knepley switch (den) { 553d6685f55SMatthew G. Knepley case DTPROB_DENSITY_CONSTANT: 554d6685f55SMatthew G. Knepley switch (dim) { 555d6685f55SMatthew G. Knepley case 1: 556d6685f55SMatthew G. Knepley if (pdf) *pdf = PetscPDFConstant1D; 557d6685f55SMatthew G. Knepley if (cdf) *cdf = PetscCDFConstant1D; 558d6685f55SMatthew G. Knepley if (sampler) *sampler = PetscPDFSampleConstant1D; 559d6685f55SMatthew G. Knepley break; 560ea1b28ebSMatthew G. Knepley case 2: 561ea1b28ebSMatthew G. Knepley if (pdf) *pdf = PetscPDFConstant2D; 562ea1b28ebSMatthew G. Knepley if (cdf) *cdf = PetscCDFConstant2D; 563ea1b28ebSMatthew G. Knepley if (sampler) *sampler = PetscPDFSampleConstant2D; 564ea1b28ebSMatthew G. Knepley break; 565ea1b28ebSMatthew G. Knepley case 3: 566ea1b28ebSMatthew G. Knepley if (pdf) *pdf = PetscPDFConstant3D; 567ea1b28ebSMatthew G. Knepley if (cdf) *cdf = PetscCDFConstant3D; 568ea1b28ebSMatthew G. Knepley if (sampler) *sampler = PetscPDFSampleConstant3D; 569ea1b28ebSMatthew G. Knepley break; 570d71ae5a4SJacob Faibussowitsch default: 571d71ae5a4SJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Dimension %" PetscInt_FMT " not supported for density type %s", dim, DTProbDensityTypes[den]); 572d6685f55SMatthew G. Knepley } 573d6685f55SMatthew G. Knepley break; 574d6685f55SMatthew G. Knepley case DTPROB_DENSITY_GAUSSIAN: 575d6685f55SMatthew G. Knepley switch (dim) { 576d6685f55SMatthew G. Knepley case 1: 577d6685f55SMatthew G. Knepley if (pdf) *pdf = PetscPDFGaussian1D; 578d6685f55SMatthew G. Knepley if (cdf) *cdf = PetscCDFGaussian1D; 579d6685f55SMatthew G. Knepley if (sampler) *sampler = PetscPDFSampleGaussian1D; 580d6685f55SMatthew G. Knepley break; 581d6685f55SMatthew G. Knepley case 2: 582d6685f55SMatthew G. Knepley if (pdf) *pdf = PetscPDFGaussian2D; 583d6685f55SMatthew G. Knepley if (sampler) *sampler = PetscPDFSampleGaussian2D; 584d6685f55SMatthew G. Knepley break; 585ea1b28ebSMatthew G. Knepley case 3: 586ea1b28ebSMatthew G. Knepley if (pdf) *pdf = PetscPDFGaussian3D; 587ea1b28ebSMatthew G. Knepley if (sampler) *sampler = PetscPDFSampleGaussian3D; 588ea1b28ebSMatthew G. Knepley break; 589d71ae5a4SJacob Faibussowitsch default: 590d71ae5a4SJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Dimension %" PetscInt_FMT " not supported for density type %s", dim, DTProbDensityTypes[den]); 591d6685f55SMatthew G. Knepley } 592d6685f55SMatthew G. Knepley break; 593d6685f55SMatthew G. Knepley case DTPROB_DENSITY_MAXWELL_BOLTZMANN: 594d6685f55SMatthew G. Knepley switch (dim) { 595d6685f55SMatthew G. Knepley case 1: 596d6685f55SMatthew G. Knepley if (pdf) *pdf = PetscPDFMaxwellBoltzmann1D; 597d6685f55SMatthew G. Knepley if (cdf) *cdf = PetscCDFMaxwellBoltzmann1D; 598d6685f55SMatthew G. Knepley break; 599d6685f55SMatthew G. Knepley case 2: 600d6685f55SMatthew G. Knepley if (pdf) *pdf = PetscPDFMaxwellBoltzmann2D; 601d6685f55SMatthew G. Knepley if (cdf) *cdf = PetscCDFMaxwellBoltzmann2D; 602d6685f55SMatthew G. Knepley break; 603d6685f55SMatthew G. Knepley case 3: 604d6685f55SMatthew G. Knepley if (pdf) *pdf = PetscPDFMaxwellBoltzmann3D; 605d6685f55SMatthew G. Knepley if (cdf) *cdf = PetscCDFMaxwellBoltzmann3D; 606d6685f55SMatthew G. Knepley break; 607d71ae5a4SJacob Faibussowitsch default: 608d71ae5a4SJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Dimension %" PetscInt_FMT " not supported for density type %s", dim, DTProbDensityTypes[den]); 609d6685f55SMatthew G. Knepley } 610d6685f55SMatthew G. Knepley break; 611d71ae5a4SJacob Faibussowitsch default: 612d71ae5a4SJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Density type %s is not supported", DTProbDensityTypes[PetscMax(0, PetscMin(den, DTPROB_NUM_DENSITY))]); 613d6685f55SMatthew G. Knepley } 6143ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 615d6685f55SMatthew G. Knepley } 616d6685f55SMatthew G. Knepley 617d6685f55SMatthew G. Knepley #ifdef PETSC_HAVE_KS 618d6685f55SMatthew G. Knepley EXTERN_C_BEGIN 619d6685f55SMatthew G. Knepley #include <KolmogorovSmirnovDist.h> 620d6685f55SMatthew G. Knepley EXTERN_C_END 621d6685f55SMatthew G. Knepley #endif 622d6685f55SMatthew G. Knepley 623e3ce8211SMatthew G. Knepley typedef enum { 624e3ce8211SMatthew G. Knepley NONE, 625e3ce8211SMatthew G. Knepley ASCII, 626e3ce8211SMatthew G. Knepley DRAW 627e3ce8211SMatthew G. Knepley } OutputType; 628e3ce8211SMatthew G. Knepley 629e3ce8211SMatthew G. Knepley static PetscErrorCode KSViewerCreate(PetscObject obj, OutputType *outputType, PetscViewer *viewer) 630e3ce8211SMatthew G. Knepley { 631e3ce8211SMatthew G. Knepley PetscViewerFormat format; 632e3ce8211SMatthew G. Knepley PetscOptions options; 633e3ce8211SMatthew G. Knepley const char *prefix; 634e3ce8211SMatthew G. Knepley PetscBool flg; 635e3ce8211SMatthew G. Knepley MPI_Comm comm; 636e3ce8211SMatthew G. Knepley 637e3ce8211SMatthew G. Knepley PetscFunctionBegin; 638e3ce8211SMatthew G. Knepley *outputType = NONE; 639e3ce8211SMatthew G. Knepley PetscCall(PetscObjectGetComm(obj, &comm)); 640e3ce8211SMatthew G. Knepley PetscCall(PetscObjectGetOptionsPrefix(obj, &prefix)); 641e3ce8211SMatthew G. Knepley PetscCall(PetscObjectGetOptions(obj, &options)); 642e3ce8211SMatthew G. Knepley PetscCall(PetscOptionsCreateViewer(comm, options, prefix, "-ks_monitor", viewer, &format, &flg)); 643e3ce8211SMatthew G. Knepley if (flg) { 644e3ce8211SMatthew G. Knepley PetscCall(PetscObjectTypeCompare((PetscObject)*viewer, PETSCVIEWERASCII, &flg)); 645e3ce8211SMatthew G. Knepley if (flg) *outputType = ASCII; 646e3ce8211SMatthew G. Knepley PetscCall(PetscObjectTypeCompare((PetscObject)*viewer, PETSCVIEWERDRAW, &flg)); 647e3ce8211SMatthew G. Knepley if (flg) *outputType = DRAW; 648e3ce8211SMatthew G. Knepley PetscCall(PetscViewerPushFormat(*viewer, format)); 649e3ce8211SMatthew G. Knepley } 650e3ce8211SMatthew G. Knepley PetscFunctionReturn(PETSC_SUCCESS); 651e3ce8211SMatthew G. Knepley } 652e3ce8211SMatthew G. Knepley 653e3ce8211SMatthew G. Knepley static PetscErrorCode KSViewerDestroy(PetscViewer *viewer) 654e3ce8211SMatthew G. Knepley { 655e3ce8211SMatthew G. Knepley PetscFunctionBegin; 656e3ce8211SMatthew G. Knepley if (*viewer) { 657e3ce8211SMatthew G. Knepley PetscCall(PetscViewerFlush(*viewer)); 658e3ce8211SMatthew G. Knepley PetscCall(PetscViewerPopFormat(*viewer)); 659e3ce8211SMatthew G. Knepley PetscCall(PetscViewerDestroy(viewer)); 660e3ce8211SMatthew G. Knepley } 661e3ce8211SMatthew G. Knepley PetscFunctionReturn(PETSC_SUCCESS); 662e3ce8211SMatthew G. Knepley } 663e3ce8211SMatthew G. Knepley 664f8662bd6SBarry Smith static PetscErrorCode PetscProbComputeKSStatistic_Internal(MPI_Comm comm, PetscInt n, PetscReal val[], PetscReal wgt[], PetscProbFn *cdf, PetscReal *alpha, OutputType outputType, PetscViewer viewer) 665e3ce8211SMatthew G. Knepley { 666e3ce8211SMatthew G. Knepley #if !defined(PETSC_HAVE_KS) 667e3ce8211SMatthew G. Knepley SETERRQ(comm, PETSC_ERR_SUP, "No support for Kolmogorov-Smirnov test.\nReconfigure using --download-ks"); 668e3ce8211SMatthew G. Knepley #else 669e3ce8211SMatthew G. Knepley PetscDraw draw; 670e3ce8211SMatthew G. Knepley PetscDrawLG lg; 671e3ce8211SMatthew G. Knepley PetscDrawAxis axis; 672e3ce8211SMatthew G. Knepley const char *names[2] = {"Analytic", "Empirical"}; 673e3ce8211SMatthew G. Knepley char title[PETSC_MAX_PATH_LEN]; 674e3ce8211SMatthew G. Knepley PetscReal Fn = 0., Dn = PETSC_MIN_REAL; 675e3ce8211SMatthew G. Knepley PetscMPIInt size; 676e3ce8211SMatthew G. Knepley 677e3ce8211SMatthew G. Knepley PetscFunctionBegin; 678e3ce8211SMatthew G. Knepley PetscCallMPI(MPI_Comm_size(comm, &size)); 679e3ce8211SMatthew G. Knepley PetscCheck(size == 1, comm, PETSC_ERR_SUP, "Parallel K-S test not yet supported"); 680e3ce8211SMatthew G. Knepley if (outputType == DRAW) { 681e3ce8211SMatthew G. Knepley PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw)); 682e3ce8211SMatthew G. Knepley PetscCall(PetscDrawLGCreate(draw, 2, &lg)); 683e3ce8211SMatthew G. Knepley PetscCall(PetscDrawLGSetLegend(lg, names)); 684e3ce8211SMatthew G. Knepley } 685e3ce8211SMatthew G. Knepley if (wgt) { 686e3ce8211SMatthew G. Knepley PetscReal *tmpv, *tmpw; 687e3ce8211SMatthew G. Knepley PetscInt *perm; 688e3ce8211SMatthew G. Knepley 689e3ce8211SMatthew G. Knepley PetscCall(PetscMalloc3(n, &perm, n, &tmpv, n, &tmpw)); 690e3ce8211SMatthew G. Knepley for (PetscInt i = 0; i < n; ++i) perm[i] = i; 691e3ce8211SMatthew G. Knepley PetscCall(PetscSortRealWithPermutation(n, val, perm)); 692e3ce8211SMatthew G. Knepley for (PetscInt i = 0; i < n; ++i) { 693e3ce8211SMatthew G. Knepley tmpv[i] = val[perm[i]]; 694e3ce8211SMatthew G. Knepley tmpw[i] = wgt[perm[i]]; 695e3ce8211SMatthew G. Knepley } 696e3ce8211SMatthew G. Knepley for (PetscInt i = 0; i < n; ++i) { 697e3ce8211SMatthew G. Knepley val[i] = tmpv[i]; 698e3ce8211SMatthew G. Knepley wgt[i] = tmpw[i]; 699e3ce8211SMatthew G. Knepley } 700e3ce8211SMatthew G. Knepley PetscCall(PetscFree3(perm, tmpv, tmpw)); 701e3ce8211SMatthew G. Knepley } else PetscCall(PetscSortReal(n, val)); 702e3ce8211SMatthew G. Knepley // Compute empirical cumulative distribution F_n and discrepancy D_n 703e3ce8211SMatthew G. Knepley for (PetscInt p = 0; p < n; ++p) { 704e3ce8211SMatthew G. Knepley const PetscReal x = val[p]; 705e3ce8211SMatthew G. Knepley const PetscReal w = wgt ? wgt[p] : 1. / n; 706e3ce8211SMatthew G. Knepley PetscReal F, vals[2]; 707e3ce8211SMatthew G. Knepley 708e3ce8211SMatthew G. Knepley Fn += w; 709e3ce8211SMatthew G. Knepley PetscCall(cdf(&x, NULL, &F)); 710e3ce8211SMatthew G. Knepley Dn = PetscMax(PetscAbsReal(Fn - F), Dn); 711e3ce8211SMatthew G. Knepley switch (outputType) { 712e3ce8211SMatthew G. Knepley case ASCII: 713e3ce8211SMatthew G. Knepley PetscCall(PetscViewerASCIIPrintf(viewer, "x: %g F: %g Fn: %g Dn: %.2g\n", x, F, Fn, Dn)); 714e3ce8211SMatthew G. Knepley break; 715e3ce8211SMatthew G. Knepley case DRAW: 716e3ce8211SMatthew G. Knepley vals[0] = F; 717e3ce8211SMatthew G. Knepley vals[1] = Fn; 718e3ce8211SMatthew G. Knepley PetscCall(PetscDrawLGAddCommonPoint(lg, x, vals)); 719e3ce8211SMatthew G. Knepley break; 720e3ce8211SMatthew G. Knepley case NONE: 721e3ce8211SMatthew G. Knepley break; 722e3ce8211SMatthew G. Knepley } 723e3ce8211SMatthew G. Knepley } 724e3ce8211SMatthew G. Knepley if (outputType == DRAW) { 725e3ce8211SMatthew G. Knepley PetscCall(PetscDrawLGGetAxis(lg, &axis)); 726e3ce8211SMatthew G. Knepley PetscCall(PetscSNPrintf(title, PETSC_MAX_PATH_LEN, "Kolmogorov-Smirnov Test (Dn %.2g)", Dn)); 727e3ce8211SMatthew G. Knepley PetscCall(PetscDrawAxisSetLabels(axis, title, "x", "CDF(x)")); 728e3ce8211SMatthew G. Knepley PetscCall(PetscDrawLGDraw(lg)); 729e3ce8211SMatthew G. Knepley PetscCall(PetscDrawLGDestroy(&lg)); 730e3ce8211SMatthew G. Knepley } 731e3ce8211SMatthew G. Knepley *alpha = KSfbar((int)n, (double)Dn); 732e3ce8211SMatthew G. Knepley if (outputType == ASCII) PetscCall(PetscViewerASCIIPrintf(viewer, "KSfbar(%" PetscInt_FMT ", %.2g): %g\n", n, Dn, *alpha)); 733e3ce8211SMatthew G. Knepley PetscFunctionReturn(PETSC_SUCCESS); 734e3ce8211SMatthew G. Knepley #endif 735e3ce8211SMatthew G. Knepley } 736e3ce8211SMatthew G. Knepley 737d6685f55SMatthew G. Knepley /*@C 738d6685f55SMatthew G. Knepley PetscProbComputeKSStatistic - Compute the Kolmogorov-Smirnov statistic for the empirical distribution for an input vector, compared to an analytic CDF. 739d6685f55SMatthew G. Knepley 74020f4b53cSBarry Smith Collective 741d6685f55SMatthew G. Knepley 742d6685f55SMatthew G. Knepley Input Parameters: 743d6685f55SMatthew G. Knepley + v - The data vector, blocksize is the sample dimension 744d6685f55SMatthew G. Knepley - cdf - The analytic CDF 745d6685f55SMatthew G. Knepley 746d6685f55SMatthew G. Knepley Output Parameter: 747d7c1f440SPierre Jolivet . alpha - The KS statistic 748d6685f55SMatthew G. Knepley 749d6685f55SMatthew G. Knepley Level: advanced 750d6685f55SMatthew G. Knepley 751dce8aebaSBarry Smith Notes: 752dce8aebaSBarry Smith The Kolmogorov-Smirnov statistic for a given cumulative distribution function $F(x)$ is 7531d27aa22SBarry Smith 7541d27aa22SBarry Smith $$ 755dce8aebaSBarry Smith D_n = \sup_x \left| F_n(x) - F(x) \right| 7561d27aa22SBarry Smith $$ 757dce8aebaSBarry Smith 758dce8aebaSBarry Smith where $\sup_x$ is the supremum of the set of distances, and the empirical distribution function $F_n(x)$ is discrete, and given by 759dce8aebaSBarry Smith 7601d27aa22SBarry Smith $$ 761dce8aebaSBarry Smith F_n = # of samples <= x / n 7621d27aa22SBarry Smith $$ 763dce8aebaSBarry Smith 764d6685f55SMatthew G. Knepley The empirical distribution function $F_n(x)$ is discrete, and thus had a ``stairstep'' 765d6685f55SMatthew G. Knepley cumulative distribution, making $n$ the number of stairs. Intuitively, the statistic takes 766d6685f55SMatthew G. Knepley the largest absolute difference between the two distribution functions across all $x$ values. 767d6685f55SMatthew G. Knepley 768e3ce8211SMatthew G. Knepley The goodness-of-fit test, or Kolmogorov-Smirnov test, is constructed using the Kolmogorov 769e3ce8211SMatthew G. Knepley distribution. It rejects the null hypothesis at level $\alpha$ if 770e3ce8211SMatthew G. Knepley 771e3ce8211SMatthew G. Knepley $$ 772e3ce8211SMatthew G. Knepley \sqrt{n} D_{n} > K_{\alpha}, 773e3ce8211SMatthew G. Knepley $$ 774e3ce8211SMatthew G. Knepley 775e3ce8211SMatthew G. Knepley where $K_\alpha$ is found from 776e3ce8211SMatthew G. Knepley 777e3ce8211SMatthew G. Knepley $$ 778e3ce8211SMatthew G. Knepley \operatorname{Pr}(K \leq K_{\alpha}) = 1 - \alpha. 779e3ce8211SMatthew G. Knepley $$ 780e3ce8211SMatthew G. Knepley 781e3ce8211SMatthew G. Knepley This means that getting a small alpha says that we have high confidence that the data did not come 782e3ce8211SMatthew G. Knepley from the input distribution, so we say that it rejects the null hypothesis. 783e3ce8211SMatthew G. Knepley 784f8662bd6SBarry Smith .seealso: `PetscProbComputeKSStatisticWeighted()`, `PetscProbComputeKSStatisticMagnitude()`, `PetscProbFn` 785d6685f55SMatthew G. Knepley @*/ 786f8662bd6SBarry Smith PetscErrorCode PetscProbComputeKSStatistic(Vec v, PetscProbFn *cdf, PetscReal *alpha) 787d71ae5a4SJacob Faibussowitsch { 788d6685f55SMatthew G. Knepley PetscViewer viewer = NULL; 789e3ce8211SMatthew G. Knepley OutputType outputType = NONE; 790e3ce8211SMatthew G. Knepley const PetscScalar *val; 791e3ce8211SMatthew G. Knepley PetscInt n; 792d6685f55SMatthew G. Knepley 793d6685f55SMatthew G. Knepley PetscFunctionBegin; 794e3ce8211SMatthew G. Knepley PetscCall(KSViewerCreate((PetscObject)v, &outputType, &viewer)); 795e3ce8211SMatthew G. Knepley PetscCall(VecGetLocalSize(v, &n)); 796e3ce8211SMatthew G. Knepley PetscCall(VecGetArrayRead(v, &val)); 797e3ce8211SMatthew G. Knepley PetscCheck(!PetscDefined(USE_COMPLEX), PetscObjectComm((PetscObject)v), PETSC_ERR_SUP, "K-S test does not support complex"); 798e3ce8211SMatthew G. Knepley PetscCall(PetscProbComputeKSStatistic_Internal(PetscObjectComm((PetscObject)v), n, (PetscReal *)val, NULL, cdf, alpha, outputType, viewer)); 799e3ce8211SMatthew G. Knepley PetscCall(VecRestoreArrayRead(v, &val)); 800e3ce8211SMatthew G. Knepley PetscCall(KSViewerDestroy(&viewer)); 801e3ce8211SMatthew G. Knepley PetscFunctionReturn(PETSC_SUCCESS); 802d6685f55SMatthew G. Knepley } 803d6685f55SMatthew G. Knepley 804e3ce8211SMatthew G. Knepley /*@C 805e3ce8211SMatthew G. Knepley PetscProbComputeKSStatisticWeighted - Compute the Kolmogorov-Smirnov statistic for the weighted empirical distribution for an input vector, compared to an analytic CDF. 806e3ce8211SMatthew G. Knepley 807e3ce8211SMatthew G. Knepley Collective 808e3ce8211SMatthew G. Knepley 809e3ce8211SMatthew G. Knepley Input Parameters: 810e3ce8211SMatthew G. Knepley + v - The data vector, blocksize is the sample dimension 811e3ce8211SMatthew G. Knepley . w - The vector of weights for each sample, instead of the default 1/n 812e3ce8211SMatthew G. Knepley - cdf - The analytic CDF 813e3ce8211SMatthew G. Knepley 814e3ce8211SMatthew G. Knepley Output Parameter: 815e3ce8211SMatthew G. Knepley . alpha - The KS statistic 816e3ce8211SMatthew G. Knepley 817e3ce8211SMatthew G. Knepley Level: advanced 818e3ce8211SMatthew G. Knepley 819e3ce8211SMatthew G. Knepley Notes: 820e3ce8211SMatthew G. Knepley The Kolmogorov-Smirnov statistic for a given cumulative distribution function $F(x)$ is 821e3ce8211SMatthew G. Knepley 822e3ce8211SMatthew G. Knepley $$ 823e3ce8211SMatthew G. Knepley D_n = \sup_x \left| F_n(x) - F(x) \right| 824e3ce8211SMatthew G. Knepley $$ 825e3ce8211SMatthew G. Knepley 826e3ce8211SMatthew G. Knepley where $\sup_x$ is the supremum of the set of distances, and the empirical distribution function $F_n(x)$ is discrete, and given by 827e3ce8211SMatthew G. Knepley 828e3ce8211SMatthew G. Knepley $$ 829e3ce8211SMatthew G. Knepley F_n = # of samples <= x / n 830e3ce8211SMatthew G. Knepley $$ 831e3ce8211SMatthew G. Knepley 832e3ce8211SMatthew G. Knepley The empirical distribution function $F_n(x)$ is discrete, and thus had a ``stairstep'' 833e3ce8211SMatthew G. Knepley cumulative distribution, making $n$ the number of stairs. Intuitively, the statistic takes 834e3ce8211SMatthew G. Knepley the largest absolute difference between the two distribution functions across all $x$ values. 835e3ce8211SMatthew G. Knepley 836e3ce8211SMatthew G. Knepley The goodness-of-fit test, or Kolmogorov-Smirnov test, is constructed using the Kolmogorov 837e3ce8211SMatthew G. Knepley distribution. It rejects the null hypothesis at level $\alpha$ if 838e3ce8211SMatthew G. Knepley 839e3ce8211SMatthew G. Knepley $$ 840e3ce8211SMatthew G. Knepley \sqrt{n} D_{n} > K_{\alpha}, 841e3ce8211SMatthew G. Knepley $$ 842e3ce8211SMatthew G. Knepley 843e3ce8211SMatthew G. Knepley where $K_\alpha$ is found from 844e3ce8211SMatthew G. Knepley 845e3ce8211SMatthew G. Knepley $$ 846e3ce8211SMatthew G. Knepley \operatorname{Pr}(K \leq K_{\alpha}) = 1 - \alpha. 847e3ce8211SMatthew G. Knepley $$ 848e3ce8211SMatthew G. Knepley 849e3ce8211SMatthew G. Knepley This means that getting a small alpha says that we have high confidence that the data did not come 850e3ce8211SMatthew G. Knepley from the input distribution, so we say that it rejects the null hypothesis. 851e3ce8211SMatthew G. Knepley 852f8662bd6SBarry Smith .seealso: `PetscProbComputeKSStatistic()`, `PetscProbComputeKSStatisticMagnitude()`, `PetscProbFn` 853e3ce8211SMatthew G. Knepley @*/ 854f8662bd6SBarry Smith PetscErrorCode PetscProbComputeKSStatisticWeighted(Vec v, Vec w, PetscProbFn *cdf, PetscReal *alpha) 855e3ce8211SMatthew G. Knepley { 856e3ce8211SMatthew G. Knepley PetscViewer viewer = NULL; 857e3ce8211SMatthew G. Knepley OutputType outputType = NONE; 858e3ce8211SMatthew G. Knepley const PetscScalar *val, *wgt; 859e3ce8211SMatthew G. Knepley PetscInt n; 860e3ce8211SMatthew G. Knepley 861e3ce8211SMatthew G. Knepley PetscFunctionBegin; 862e3ce8211SMatthew G. Knepley PetscCall(KSViewerCreate((PetscObject)v, &outputType, &viewer)); 863e3ce8211SMatthew G. Knepley PetscCall(VecGetLocalSize(v, &n)); 864e3ce8211SMatthew G. Knepley PetscCall(VecGetArrayRead(v, &val)); 865e3ce8211SMatthew G. Knepley PetscCall(VecGetArrayRead(w, &wgt)); 866e3ce8211SMatthew G. Knepley PetscCheck(!PetscDefined(USE_COMPLEX), PetscObjectComm((PetscObject)v), PETSC_ERR_SUP, "K-S test does not support complex"); 867e3ce8211SMatthew G. Knepley PetscCall(PetscProbComputeKSStatistic_Internal(PetscObjectComm((PetscObject)v), n, (PetscReal *)val, (PetscReal *)wgt, cdf, alpha, outputType, viewer)); 868e3ce8211SMatthew G. Knepley PetscCall(VecRestoreArrayRead(v, &val)); 869e3ce8211SMatthew G. Knepley PetscCall(VecRestoreArrayRead(w, &wgt)); 870e3ce8211SMatthew G. Knepley PetscCall(KSViewerDestroy(&viewer)); 871e3ce8211SMatthew G. Knepley PetscFunctionReturn(PETSC_SUCCESS); 872e3ce8211SMatthew G. Knepley } 873e3ce8211SMatthew G. Knepley 874e3ce8211SMatthew G. Knepley /*@C 875e3ce8211SMatthew G. Knepley PetscProbComputeKSStatisticMagnitude - Compute the Kolmogorov-Smirnov statistic for the empirical distribution for the magnitude over each block of an input vector, compared to an analytic CDF. 876e3ce8211SMatthew G. Knepley 877e3ce8211SMatthew G. Knepley Collective 878e3ce8211SMatthew G. Knepley 879e3ce8211SMatthew G. Knepley Input Parameters: 880e3ce8211SMatthew G. Knepley + v - The data vector, blocksize is the sample dimension 881e3ce8211SMatthew G. Knepley - cdf - The analytic CDF 882e3ce8211SMatthew G. Knepley 883e3ce8211SMatthew G. Knepley Output Parameter: 884e3ce8211SMatthew G. Knepley . alpha - The KS statistic 885e3ce8211SMatthew G. Knepley 886e3ce8211SMatthew G. Knepley Level: advanced 887e3ce8211SMatthew G. Knepley 888e3ce8211SMatthew G. Knepley Notes: 889e3ce8211SMatthew G. Knepley The Kolmogorov-Smirnov statistic for a given cumulative distribution function $F(x)$ is 890e3ce8211SMatthew G. Knepley 891e3ce8211SMatthew G. Knepley $$ 892e3ce8211SMatthew G. Knepley D_n = \sup_x \left| F_n(x) - F(x) \right| 893e3ce8211SMatthew G. Knepley $$ 894e3ce8211SMatthew G. Knepley 895e3ce8211SMatthew G. Knepley where $\sup_x$ is the supremum of the set of distances, and the empirical distribution function $F_n(x)$ is discrete, and given by 896e3ce8211SMatthew G. Knepley 897e3ce8211SMatthew G. Knepley $$ 898e3ce8211SMatthew G. Knepley F_n = # of samples <= x / n 899e3ce8211SMatthew G. Knepley $$ 900e3ce8211SMatthew G. Knepley 901e3ce8211SMatthew G. Knepley The empirical distribution function $F_n(x)$ is discrete, and thus had a ``stairstep'' 902e3ce8211SMatthew G. Knepley cumulative distribution, making $n$ the number of stairs. Intuitively, the statistic takes 903e3ce8211SMatthew G. Knepley the largest absolute difference between the two distribution functions across all $x$ values. 904e3ce8211SMatthew G. Knepley 905e3ce8211SMatthew G. Knepley The goodness-of-fit test, or Kolmogorov-Smirnov test, is constructed using the Kolmogorov 906e3ce8211SMatthew G. Knepley distribution. It rejects the null hypothesis at level $\alpha$ if 907e3ce8211SMatthew G. Knepley 908e3ce8211SMatthew G. Knepley $$ 909e3ce8211SMatthew G. Knepley \sqrt{n} D_{n} > K_{\alpha}, 910e3ce8211SMatthew G. Knepley $$ 911e3ce8211SMatthew G. Knepley 912e3ce8211SMatthew G. Knepley where $K_\alpha$ is found from 913e3ce8211SMatthew G. Knepley 914e3ce8211SMatthew G. Knepley $$ 915e3ce8211SMatthew G. Knepley \operatorname{Pr}(K \leq K_{\alpha}) = 1 - \alpha. 916e3ce8211SMatthew G. Knepley $$ 917e3ce8211SMatthew G. Knepley 918e3ce8211SMatthew G. Knepley This means that getting a small alpha says that we have high confidence that the data did not come 919e3ce8211SMatthew G. Knepley from the input distribution, so we say that it rejects the null hypothesis. 920e3ce8211SMatthew G. Knepley 921f8662bd6SBarry Smith .seealso: `PetscProbComputeKSStatistic()`, `PetscProbComputeKSStatisticWeighted()`, `PetscProbFn` 922e3ce8211SMatthew G. Knepley @*/ 923f8662bd6SBarry Smith PetscErrorCode PetscProbComputeKSStatisticMagnitude(Vec v, PetscProbFn *cdf, PetscReal *alpha) 924e3ce8211SMatthew G. Knepley { 925e3ce8211SMatthew G. Knepley PetscViewer viewer = NULL; 926e3ce8211SMatthew G. Knepley OutputType outputType = NONE; 927e3ce8211SMatthew G. Knepley const PetscScalar *a; 928e3ce8211SMatthew G. Knepley PetscReal *speed; 929e3ce8211SMatthew G. Knepley PetscInt n, dim; 930e3ce8211SMatthew G. Knepley 931e3ce8211SMatthew G. Knepley PetscFunctionBegin; 932e3ce8211SMatthew G. Knepley PetscCall(KSViewerCreate((PetscObject)v, &outputType, &viewer)); 933e3ce8211SMatthew G. Knepley // Convert to a scalar value 9349566063dSJacob Faibussowitsch PetscCall(VecGetLocalSize(v, &n)); 9359566063dSJacob Faibussowitsch PetscCall(VecGetBlockSize(v, &dim)); 936d6685f55SMatthew G. Knepley n /= dim; 9379566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(n, &speed)); 9389566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(v, &a)); 939e3ce8211SMatthew G. Knepley for (PetscInt p = 0; p < n; ++p) { 940d6685f55SMatthew G. Knepley PetscReal mag = 0.; 941d6685f55SMatthew G. Knepley 942e3ce8211SMatthew G. Knepley for (PetscInt d = 0; d < dim; ++d) mag += PetscSqr(PetscRealPart(a[p * dim + d])); 943d6685f55SMatthew G. Knepley speed[p] = PetscSqrtReal(mag); 944d6685f55SMatthew G. Knepley } 9459566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(v, &a)); 946e3ce8211SMatthew G. Knepley // Compute statistic 947e3ce8211SMatthew G. Knepley PetscCall(PetscProbComputeKSStatistic_Internal(PetscObjectComm((PetscObject)v), n, speed, NULL, cdf, alpha, outputType, viewer)); 9489566063dSJacob Faibussowitsch PetscCall(PetscFree(speed)); 949e3ce8211SMatthew G. Knepley PetscCall(KSViewerDestroy(&viewer)); 9503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 951d6685f55SMatthew G. Knepley } 952