xref: /petsc/src/sys/classes/random/impls/sprng/sprng.c (revision d71ae5a4db6382e7f06317b8d368875286fe9008)
1 
2 #include <petsc/private/randomimpl.h>
3 
4 #define USE_MPI
5 #define SIMPLE_SPRNG
6 EXTERN_C_BEGIN
7 #include <sprng.h>
8 EXTERN_C_END
9 
10 PetscErrorCode PetscRandomSeed_Sprng(PetscRandom r)
11 {
12   PetscFunctionBegin;
13   init_sprng(r->seed, SPRNG_DEFAULT);
14   PetscFunctionReturn(0);
15 }
16 
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(0);
31 }
32 
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(0);
44 }
45 
46 static struct _PetscRandomOps PetscRandomOps_Values = {
47   PetscDesignatedInitializer(seed, PetscRandomSeed_Sprng),
48   PetscDesignatedInitializer(getvalue, PetscRandomGetValue_Sprng),
49   PetscDesignatedInitializer(getvaluereal, PetscRandomGetValueReal_Sprng),
50 };
51 
52 /*MC
53    PETSCSPRNG - access to the publically available random number generator sprng
54 
55    Options Database Keys:
56 . -random_type <rand,rand48,sprng> - select the random number generator at runtime
57 
58    Note:
59    PETSc must be ./configure with the option --download-sprng to use this random number generator.
60 
61    Developer Note:
62    This is NOT currently using a parallel random number generator. Sprng does have
63    an MPI version we should investigate.
64 
65   Level: beginner
66 
67 .seealso: `RandomCreate()`, `RandomSetType()`, `PETSCRAND`, `PETSCRAND48`, `PetscRandomSetFromOptions()`
68 M*/
69 
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(0);
76 }
77