Actual source code: sprng.c
2: #include <petsc/private/randomimpl.h>
4: #define USE_MPI
5: #define SIMPLE_SPRNG
6: EXTERN_C_BEGIN
7: #include <sprng.h>
8: EXTERN_C_END
10: PetscErrorCode PetscRandomSeed_Sprng(PetscRandom r)
11: {
12: init_sprng(r->seed, SPRNG_DEFAULT);
13: return 0;
14: }
16: PetscErrorCode PetscRandomGetValue_Sprng(PetscRandom r, PetscScalar *val)
17: {
18: #if defined(PETSC_USE_COMPLEX)
19: if (r->iset) {
20: *val = PetscRealPart(r->width) * sprng() + PetscRealPart(r->low) + (PetscImaginaryPart(r->width) * sprng() + PetscImaginaryPart(r->low)) * PETSC_i;
21: } else {
22: *val = sprng() + sprng() * PETSC_i;
23: }
24: #else
25: if (r->iset) *val = r->width * sprng() + r->low;
26: else *val = sprng();
27: #endif
28: return 0;
29: }
31: PetscErrorCode PetscRandomGetValueReal_Sprng(PetscRandom r, PetscReal *val)
32: {
33: #if defined(PETSC_USE_COMPLEX)
34: if (r->iset) *val = PetscRealPart(r->width) * sprng() + PetscRealPart(r->low);
35: else *val = sprng();
36: #else
37: if (r->iset) *val = r->width * sprng() + r->low;
38: else *val = sprng();
39: #endif
40: return 0;
41: }
43: static struct _PetscRandomOps PetscRandomOps_Values = {
44: PetscDesignatedInitializer(seed, PetscRandomSeed_Sprng),
45: PetscDesignatedInitializer(getvalue, PetscRandomGetValue_Sprng),
46: PetscDesignatedInitializer(getvaluereal, PetscRandomGetValueReal_Sprng),
47: };
49: /*MC
50: PETSCSPRNG - access to the publicly available random number generator sprng
52: Options Database Keys:
53: . -random_type <rand,rand48,sprng> - select the random number generator at runtime
55: Note:
56: PETSc must be ./configure with the option --download-sprng to use this random number generator.
58: Developer Note:
59: This is NOT currently using a parallel random number generator. Sprng does have
60: an MPI version we should investigate.
62: Level: beginner
64: .seealso: `RandomCreate()`, `RandomSetType()`, `PETSCRAND`, `PETSCRAND48`, `PetscRandomSetFromOptions()`
65: M*/
67: PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom r)
68: {
69: PetscMemcpy(r->ops, &PetscRandomOps_Values, sizeof(PetscRandomOps_Values));
70: PetscObjectChangeTypeName((PetscObject)r, PETSCSPRNG);
71: return 0;
72: }