Actual source code: sprng.c
1: #define PETSC_DLL
3: #include ../src/sys/random/randomimpl.h
4: #if defined (PETSC_HAVE_STDLIB_H)
5: #include <stdlib.h>
6: #endif
8: #define USE_MPI
9: #define SIMPLE_SPRNG
11: #include "sprng.h"
16: PetscErrorCode PetscRandomSeed_Sprng(PetscRandom r)
17: {
19: init_sprng(r->seed,SPRNG_DEFAULT);
20: return(0);
21: }
25: PetscErrorCode PetscRandomGetValue_Sprng(PetscRandom r,PetscScalar *val)
26: {
28: #if defined(PETSC_USE_COMPLEX)
29: if (r->iset) {
30: *val = PetscRealPart(r->width)*sprng() + PetscRealPart(r->low) +
31: (PetscImaginaryPart(r->width)*sprng() + PetscImaginaryPart(r->low)) * PETSC_i;
32: } else {
33: *val = sprng() + sprng()*PETSC_i;
34: }
35: #else
36: if (r->iset) *val = r->width * sprng() + r->low;
37: else *val = sprng();
38: #endif
39: return(0);
40: }
44: PetscErrorCode PetscRandomGetValueReal_Sprng(PetscRandom r,PetscScalar *val)
45: {
47: #if defined(PETSC_USE_COMPLEX)
48: if (r->iset) *val = PetscRealPart(r->width)*sprng() + PetscRealPart(r->low);
49: else *val = sprng();
50: #else
51: if (r->iset) *val = r->width * sprng() + r->low;
52: else *val = sprng();
53: #endif
54: return(0);
55: }
59: PetscErrorCode PetscRandomGetValueImaginary_Sprng(PetscRandom r,PetscScalar *val)
60: {
62: #if defined(PETSC_USE_COMPLEX)
63: if (r->iset) *val = (PetscImaginaryPart(r->width)*sprng()+PetscImaginaryPart(r->low))*PETSC_i;
64: else *val = sprng()*PETSC_i;
65: #else
66: if (r->iset) *val = r->width * sprng() + r->low;
67: else *val = sprng();
68: #endif
69: return(0);
70: }
72: static struct _PetscRandomOps PetscRandomOps_Values = {
73: /* 0 */
74: PetscRandomSeed_Sprng,
75: PetscRandomGetValue_Sprng,
76: PetscRandomGetValueReal_Sprng,
77: PetscRandomGetValueImaginary_Sprng,
78: 0,
79: /* 5 */
80: 0
81: };
83: /*MC
84: PETSCSPRNG- access to the publically available random number generator sprng
86: Options Database Keys:
87: . -random_type <rand,rand48,sprng>
89: Level: beginner
91: PETSc must have been config/configure.py with the option --download-sprng to use
92: this random number generator.
94: This is NOT currently using a parallel random number generator. Sprng does have
95: an MPI version we should investigate.
97: .seealso: RandomCreate(), RandomSetType(), PETSCRAND, PETSCRAND48
98: M*/
103: PetscErrorCode PetscRandomCreate_Sprng(PetscRandom r)
104: {
108: PetscMemcpy(r->ops,&PetscRandomOps_Values,sizeof(PetscRandomOps_Values));
109: PetscObjectChangeTypeName((PetscObject)r,PETSCSPRNG);
110: PetscPublishAll(r);
111: return(0);
112: }