Actual source code: rand.c
1: #include <petsc/private/randomimpl.h>
3: static PetscErrorCode PetscRandomSeed_Rand(PetscRandom r)
4: {
5: PetscFunctionBegin;
6: srand((unsigned int)r->seed);
7: PetscFunctionReturn(PETSC_SUCCESS);
8: }
10: #define RAND_WRAP ((PetscReal)(rand() / (double)((unsigned int)RAND_MAX + 1)))
11: static PetscErrorCode PetscRandomGetValue_Rand(PetscRandom r, PetscScalar *val)
12: {
13: PetscFunctionBegin;
14: #if defined(PETSC_USE_COMPLEX)
15: if (r->iset) *val = PetscRealPart(r->width) * RAND_WRAP + PetscRealPart(r->low) + (PetscImaginaryPart(r->width) * RAND_WRAP + PetscImaginaryPart(r->low)) * PETSC_i;
16: else *val = RAND_WRAP + RAND_WRAP * PETSC_i;
17: #else
18: if (r->iset) *val = r->width * RAND_WRAP + r->low;
19: else *val = RAND_WRAP;
20: #endif
21: PetscFunctionReturn(PETSC_SUCCESS);
22: }
24: static PetscErrorCode PetscRandomGetValueReal_Rand(PetscRandom r, PetscReal *val)
25: {
26: PetscFunctionBegin;
27: #if defined(PETSC_USE_COMPLEX)
28: if (r->iset) *val = PetscRealPart(r->width) * RAND_WRAP + PetscRealPart(r->low);
29: else *val = RAND_WRAP;
30: #else
31: if (r->iset) *val = r->width * RAND_WRAP + r->low;
32: else *val = RAND_WRAP;
33: #endif
34: PetscFunctionReturn(PETSC_SUCCESS);
35: }
37: static struct _PetscRandomOps PetscRandomOps_Values = {
38: PetscDesignatedInitializer(seed, PetscRandomSeed_Rand),
39: PetscDesignatedInitializer(getvalue, PetscRandomGetValue_Rand),
40: PetscDesignatedInitializer(getvaluereal, PetscRandomGetValueReal_Rand),
41: PetscDesignatedInitializer(getvalues, NULL),
42: PetscDesignatedInitializer(getvaluesreal, NULL),
43: PetscDesignatedInitializer(destroy, NULL),
44: PetscDesignatedInitializer(setfromoptions, NULL),
45: };
47: /*MC
48: PETSCRAND - access to the basic Unix random number generator
50: Options Database Key:
51: . -random_type <rand,rand48,sprng> - set the random number generator from the options database
53: Level: beginner
55: Note:
56: Not recommended since it can produce different numbers on different systems
58: .seealso: `PetscRandomCreate()`, `PetscRandomSetType()`, `PETSCRAND48`, `PETSCSPRNG`, `PetscRandomSetFromOptions()`, `PetscRandomType`
59: M*/
61: PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom r)
62: {
63: PetscFunctionBegin;
64: r->ops[0] = PetscRandomOps_Values;
65: PetscCall(PetscObjectChangeTypeName((PetscObject)r, PETSCRAND));
66: PetscFunctionReturn(PETSC_SUCCESS);
67: }