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: PetscFunctionBegin;
13: init_sprng(r->seed, SPRNG_DEFAULT);
14: PetscFunctionReturn(PETSC_SUCCESS);
15: }
17: PetscErrorCode PetscRandomGetValue_Sprng(PetscRandom r, PetscScalar *val)
18: {
19: PetscFunctionBegin;
20: #if defined(PETSC_USE_COMPLEX)
21: if (r->iset) {
22: *val = PetscRealPart(r->width) * sprng() + PetscRealPart(r->low) + (PetscImaginaryPart(r->width) * sprng() + PetscImaginaryPart(r->low)) * PETSC_i;
23: } else {
24: *val = sprng() + sprng() * PETSC_i;
25: }
26: #else
27: if (r->iset) *val = r->width * sprng() + r->low;
28: else *val = sprng();
29: #endif
30: PetscFunctionReturn(PETSC_SUCCESS);
31: }
33: PetscErrorCode PetscRandomGetValueReal_Sprng(PetscRandom r, PetscReal *val)
34: {
35: PetscFunctionBegin;
36: #if defined(PETSC_USE_COMPLEX)
37: if (r->iset) *val = PetscRealPart(r->width) * sprng() + PetscRealPart(r->low);
38: else *val = sprng();
39: #else
40: if (r->iset) *val = r->width * sprng() + r->low;
41: else *val = sprng();
42: #endif
43: PetscFunctionReturn(PETSC_SUCCESS);
44: }
46: static struct _PetscRandomOps PetscRandomOps_Values = {
47: PetscDesignatedInitializer(seed, PetscRandomSeed_Sprng),
48: PetscDesignatedInitializer(getvalue, PetscRandomGetValue_Sprng),
49: PetscDesignatedInitializer(getvaluereal, PetscRandomGetValueReal_Sprng),
50: };
52: /*MC
53: PETSCSPRNG - access to the publicly available random number generator sprng
55: Options Database Keys:
56: . -random_type <rand,rand48,sprng> - select the random number generator at runtime
58: Note:
59: PETSc must be ./configure with the option --download-sprng to use this random number generator.
61: Developer Note:
62: This is NOT currently using a parallel random number generator. Sprng does have
63: an MPI version we should investigate.
65: Level: beginner
67: .seealso: `RandomCreate()`, `RandomSetType()`, `PETSCRAND`, `PETSCRAND48`, `PetscRandomSetFromOptions()`
68: M*/
70: PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom r)
71: {
72: PetscFunctionBegin;
73: PetscCall(PetscMemcpy(r->ops, &PetscRandomOps_Values, sizeof(PetscRandomOps_Values)));
74: PetscCall(PetscObjectChangeTypeName((PetscObject)r, PETSCSPRNG));
75: PetscFunctionReturn(PETSC_SUCCESS);
76: }