Actual source code: rand.c
1: #define PETSC_DLL
3: #include "src/sys/utils/random/randomimpl.h"
4: #if defined (PETSC_HAVE_STDLIB_H)
5: #include <stdlib.h>
6: #endif
10: PetscErrorCode PetscRandomSeed_Rand(PetscRandom r)
11: {
13: srand(r->seed);
14: return(0);
15: }
17: #define RAND_WRAP() (rand()/(double)((unsigned int)RAND_MAX+1))
20: PetscErrorCode PetscRandomGetValue_Rand(PetscRandom r,PetscScalar *val)
21: {
23: #if defined(PETSC_USE_COMPLEX)
24: if (r->iset)
25: *val = PetscRealPart(r->width)*RAND_WRAP() + PetscRealPart(r->low) +
26: (PetscImaginaryPart(r->width)*RAND_WRAP() + PetscImaginaryPart(r->low)) * PETSC_i;
27: else *val = RAND_WRAP() + RAND_WRAP()*PETSC_i;
28: #else
29: if (r->iset) *val = r->width * RAND_WRAP() + r->low;
30: else *val = RAND_WRAP();
31: #endif
32: return(0);
33: }
37: PetscErrorCode PetscRandomGetValueReal_Rand(PetscRandom r,PetscReal *val)
38: {
40: #if defined(PETSC_USE_COMPLEX)
41: if (r->iset) *val = PetscRealPart(r->width)*RAND_WRAP() + PetscRealPart(r->low);
42: else *val = RAND_WRAP();
43: #else
44: if (r->iset) *val = r->width * RAND_WRAP() + r->low;
45: else *val = RAND_WRAP();
46: #endif
47: return(0);
48: }
52: PetscErrorCode PetscRandomGetValueImaginary_Rand(PetscRandom r,PetscScalar *val)
53: {
55: #if defined(PETSC_USE_COMPLEX)
56: if (r->iset) *val = (PetscImaginaryPart(r->width)*RAND_WRAP()+PetscImaginaryPart(r->low))*PETSC_i;
57: else *val = RAND_WRAP()*PETSC_i;
58: #else
59: if (r->iset) *val = r->width * RAND_WRAP() + r->low;
60: else *val = RAND_WRAP();
61: #endif
62: return(0);
63: }
65: static struct _PetscRandomOps PetscRandomOps_Values = {
66: /* 0 */
67: PetscRandomSeed_Rand,
68: PetscRandomGetValue_Rand,
69: PetscRandomGetValueReal_Rand,
70: PetscRandomGetValueImaginary_Rand,
71: 0,
72: /* 5 */
73: 0
74: };
79: PetscErrorCode PetscRandomCreate_Rand(PetscRandom r)
80: {
84: PetscMemcpy(r->ops,&PetscRandomOps_Values,sizeof(PetscRandomOps_Values));
85: PetscObjectChangeTypeName((PetscObject)r,PETSCRAND);
86: PetscPublishAll(r);
87: return(0);
88: }