xref: /petsc/src/sys/classes/random/impls/rand/rand.c (revision 5c6c1daec53e1d9ab0bec9db5309fd8fc7645b8d)
1*5c6c1daeSBarry Smith 
2*5c6c1daeSBarry Smith #include <../src/sys/classes/random/randomimpl.h>
3*5c6c1daeSBarry Smith #if defined (PETSC_HAVE_STDLIB_H)
4*5c6c1daeSBarry Smith #include <stdlib.h>
5*5c6c1daeSBarry Smith #endif
6*5c6c1daeSBarry Smith 
7*5c6c1daeSBarry Smith #undef __FUNCT__
8*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomSeed_Rand"
9*5c6c1daeSBarry Smith PetscErrorCode  PetscRandomSeed_Rand(PetscRandom r)
10*5c6c1daeSBarry Smith {
11*5c6c1daeSBarry Smith   PetscFunctionBegin;
12*5c6c1daeSBarry Smith   srand(r->seed);
13*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
14*5c6c1daeSBarry Smith }
15*5c6c1daeSBarry Smith 
16*5c6c1daeSBarry Smith #define RAND_WRAP ((PetscReal)((rand()/(double)((unsigned int)RAND_MAX+1))))
17*5c6c1daeSBarry Smith #undef __FUNCT__
18*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomGetValue_Rand"
19*5c6c1daeSBarry Smith PetscErrorCode  PetscRandomGetValue_Rand(PetscRandom r,PetscScalar *val)
20*5c6c1daeSBarry Smith {
21*5c6c1daeSBarry Smith   PetscFunctionBegin;
22*5c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
23*5c6c1daeSBarry Smith   if (r->iset)
24*5c6c1daeSBarry Smith     *val = PetscRealPart(r->width)*RAND_WRAP + PetscRealPart(r->low) +
25*5c6c1daeSBarry Smith       (PetscImaginaryPart(r->width)*RAND_WRAP + PetscImaginaryPart(r->low)) * PETSC_i;
26*5c6c1daeSBarry Smith   else *val = RAND_WRAP + RAND_WRAP*PETSC_i;
27*5c6c1daeSBarry Smith #else
28*5c6c1daeSBarry Smith   if (r->iset) *val = r->width * RAND_WRAP + r->low;
29*5c6c1daeSBarry Smith   else         *val = RAND_WRAP;
30*5c6c1daeSBarry Smith #endif
31*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
32*5c6c1daeSBarry Smith }
33*5c6c1daeSBarry Smith 
34*5c6c1daeSBarry Smith #undef __FUNCT__
35*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomGetValueReal_Rand"
36*5c6c1daeSBarry Smith PetscErrorCode  PetscRandomGetValueReal_Rand(PetscRandom r,PetscReal *val)
37*5c6c1daeSBarry Smith {
38*5c6c1daeSBarry Smith   PetscFunctionBegin;
39*5c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
40*5c6c1daeSBarry Smith     if (r->iset) *val = PetscRealPart(r->width)*RAND_WRAP + PetscRealPart(r->low);
41*5c6c1daeSBarry Smith     else         *val = RAND_WRAP;
42*5c6c1daeSBarry Smith #else
43*5c6c1daeSBarry Smith   if (r->iset) *val = r->width * RAND_WRAP + r->low;
44*5c6c1daeSBarry Smith   else         *val = RAND_WRAP;
45*5c6c1daeSBarry Smith #endif
46*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
47*5c6c1daeSBarry Smith }
48*5c6c1daeSBarry Smith 
49*5c6c1daeSBarry Smith static struct _PetscRandomOps PetscRandomOps_Values = {
50*5c6c1daeSBarry Smith   /* 0 */
51*5c6c1daeSBarry Smith   PetscRandomSeed_Rand,
52*5c6c1daeSBarry Smith   PetscRandomGetValue_Rand,
53*5c6c1daeSBarry Smith   PetscRandomGetValueReal_Rand,
54*5c6c1daeSBarry Smith    0,
55*5c6c1daeSBarry Smith   /* 5 */
56*5c6c1daeSBarry Smith   0
57*5c6c1daeSBarry Smith };
58*5c6c1daeSBarry Smith 
59*5c6c1daeSBarry Smith /*MC
60*5c6c1daeSBarry Smith    PETSCRAND - access to the basic Unix random number generator
61*5c6c1daeSBarry Smith 
62*5c6c1daeSBarry Smith    Options Database Keys:
63*5c6c1daeSBarry Smith . -random_type <rand,rand48,sprng>
64*5c6c1daeSBarry Smith 
65*5c6c1daeSBarry Smith   Level: beginner
66*5c6c1daeSBarry Smith 
67*5c6c1daeSBarry Smith .seealso: RandomCreate(), RandomSetType(), PETSCRAND48, PETSCSPRNG
68*5c6c1daeSBarry Smith M*/
69*5c6c1daeSBarry Smith 
70*5c6c1daeSBarry Smith EXTERN_C_BEGIN
71*5c6c1daeSBarry Smith #undef __FUNCT__
72*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomCreate_Rand"
73*5c6c1daeSBarry Smith PetscErrorCode  PetscRandomCreate_Rand(PetscRandom r)
74*5c6c1daeSBarry Smith {
75*5c6c1daeSBarry Smith   PetscErrorCode ierr;
76*5c6c1daeSBarry Smith 
77*5c6c1daeSBarry Smith   PetscFunctionBegin;
78*5c6c1daeSBarry Smith   ierr = PetscMemcpy(r->ops,&PetscRandomOps_Values,sizeof(PetscRandomOps_Values));CHKERRQ(ierr);
79*5c6c1daeSBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)r,PETSCRAND);CHKERRQ(ierr);
80*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
81*5c6c1daeSBarry Smith }
82*5c6c1daeSBarry Smith EXTERN_C_END
83