xref: /petsc/src/sys/classes/random/impls/sprng/sprng.c (revision a69119a591a03a9d906b29c0a4e9802e4d7c9795)
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   PetscFunctionBegin;
12   init_sprng(r->seed, SPRNG_DEFAULT);
13   PetscFunctionReturn(0);
14 }
15 
16 PetscErrorCode PetscRandomGetValue_Sprng(PetscRandom r, PetscScalar *val) {
17   PetscFunctionBegin;
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   PetscFunctionReturn(0);
29 }
30 
31 PetscErrorCode PetscRandomGetValueReal_Sprng(PetscRandom r, PetscReal *val) {
32   PetscFunctionBegin;
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   PetscFunctionReturn(0);
41 }
42 
43 static struct _PetscRandomOps PetscRandomOps_Values = {
44   PetscDesignatedInitializer(seed, PetscRandomSeed_Sprng),
45   PetscDesignatedInitializer(getvalue, PetscRandomGetValue_Sprng),
46   PetscDesignatedInitializer(getvaluereal, PetscRandomGetValueReal_Sprng),
47 };
48 
49 /*MC
50    PETSCSPRNG - access to the publically available random number generator sprng
51 
52    Options Database Keys:
53 . -random_type <rand,rand48,sprng> - select the random number generator at runtime
54 
55    Note:
56    PETSc must be ./configure with the option --download-sprng to use this random number generator.
57 
58    Developer Note:
59    This is NOT currently using a parallel random number generator. Sprng does have
60    an MPI version we should investigate.
61 
62   Level: beginner
63 
64 .seealso: `RandomCreate()`, `RandomSetType()`, `PETSCRAND`, `PETSCRAND48`, `PetscRandomSetFromOptions()`
65 M*/
66 
67 PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom r) {
68   PetscFunctionBegin;
69   PetscCall(PetscMemcpy(r->ops, &PetscRandomOps_Values, sizeof(PetscRandomOps_Values)));
70   PetscCall(PetscObjectChangeTypeName((PetscObject)r, PETSCSPRNG));
71   PetscFunctionReturn(0);
72 }
73