Actual source code: rand.c
2: #include <petsc/private/randomimpl.h>
4: PetscErrorCode PetscRandomSeed_Rand(PetscRandom r)
5: {
6: srand(r->seed);
7: return 0;
8: }
10: #define RAND_WRAP ((PetscReal)((rand() / (double)((unsigned int)RAND_MAX + 1))))
11: PetscErrorCode PetscRandomGetValue_Rand(PetscRandom r, PetscScalar *val)
12: {
13: #if defined(PETSC_USE_COMPLEX)
14: if (r->iset) *val = PetscRealPart(r->width) * RAND_WRAP + PetscRealPart(r->low) + (PetscImaginaryPart(r->width) * RAND_WRAP + PetscImaginaryPart(r->low)) * PETSC_i;
15: else *val = RAND_WRAP + RAND_WRAP * PETSC_i;
16: #else
17: if (r->iset) *val = r->width * RAND_WRAP + r->low;
18: else *val = RAND_WRAP;
19: #endif
20: return 0;
21: }
23: PetscErrorCode PetscRandomGetValueReal_Rand(PetscRandom r, PetscReal *val)
24: {
25: #if defined(PETSC_USE_COMPLEX)
26: if (r->iset) *val = PetscRealPart(r->width) * RAND_WRAP + PetscRealPart(r->low);
27: else *val = RAND_WRAP;
28: #else
29: if (r->iset) *val = r->width * RAND_WRAP + r->low;
30: else *val = RAND_WRAP;
31: #endif
32: return 0;
33: }
35: static struct _PetscRandomOps PetscRandomOps_Values = {
36: PetscDesignatedInitializer(seed, PetscRandomSeed_Rand),
37: PetscDesignatedInitializer(getvalue, PetscRandomGetValue_Rand),
38: PetscDesignatedInitializer(getvaluereal, PetscRandomGetValueReal_Rand),
39: };
41: /*MC
42: PETSCRAND - access to the basic Unix random number generator
44: Options Database Keys:
45: . -random_type <rand,rand48,sprng> - set the random number generator from the options database
47: Level: beginner
49: Note:
50: Not recommended since it can produce different numbers on different systems
52: .seealso: `PetscRandomCreate()`, `PetscRandomSetType()`, `PETSCRAND48`, `PETSCSPRNG`, `PetscRandomSetFromOptions()`, `PetscRandomType`
53: M*/
55: PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom r)
56: {
57: PetscMemcpy(r->ops, &PetscRandomOps_Values, sizeof(PetscRandomOps_Values));
58: PetscObjectChangeTypeName((PetscObject)r, PETSCRAND);
59: return 0;
60: }