xref: /petsc/src/sys/classes/random/impls/rand48/rand48.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_Rand48"
9*5c6c1daeSBarry Smith PetscErrorCode  PetscRandomSeed_Rand48(PetscRandom r)
10*5c6c1daeSBarry Smith {
11*5c6c1daeSBarry Smith   PetscFunctionBegin;
12*5c6c1daeSBarry Smith   srand48(r->seed);
13*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
14*5c6c1daeSBarry Smith }
15*5c6c1daeSBarry Smith 
16*5c6c1daeSBarry Smith #undef __FUNCT__
17*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomGetValue_Rand48"
18*5c6c1daeSBarry Smith PetscErrorCode  PetscRandomGetValue_Rand48(PetscRandom r,PetscScalar *val)
19*5c6c1daeSBarry Smith {
20*5c6c1daeSBarry Smith   PetscFunctionBegin;
21*5c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
22*5c6c1daeSBarry Smith   if (r->iset) {
23*5c6c1daeSBarry Smith     *val = PetscRealPart(r->width)*(PetscReal)drand48() + PetscRealPart(r->low) +
24*5c6c1daeSBarry Smith       (PetscImaginaryPart(r->width)*(PetscReal)drand48() + PetscImaginaryPart(r->low)) * PETSC_i;
25*5c6c1daeSBarry Smith   } else {
26*5c6c1daeSBarry Smith     *val = (PetscReal)drand48() + (PetscReal)drand48()*PETSC_i;
27*5c6c1daeSBarry Smith   }
28*5c6c1daeSBarry Smith #else
29*5c6c1daeSBarry Smith   if (r->iset) *val = r->width * drand48() + r->low;
30*5c6c1daeSBarry Smith   else         *val = drand48();
31*5c6c1daeSBarry Smith #endif
32*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
33*5c6c1daeSBarry Smith }
34*5c6c1daeSBarry Smith 
35*5c6c1daeSBarry Smith #undef __FUNCT__
36*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomGetValueReal_Rand48"
37*5c6c1daeSBarry Smith PetscErrorCode  PetscRandomGetValueReal_Rand48(PetscRandom r,PetscReal *val)
38*5c6c1daeSBarry Smith {
39*5c6c1daeSBarry Smith   PetscFunctionBegin;
40*5c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
41*5c6c1daeSBarry Smith   if (r->iset) *val = PetscRealPart(r->width)*drand48() + PetscRealPart(r->low);
42*5c6c1daeSBarry Smith   else         *val = drand48();
43*5c6c1daeSBarry Smith #else
44*5c6c1daeSBarry Smith   if (r->iset) *val = r->width * drand48() + r->low;
45*5c6c1daeSBarry Smith   else         *val = drand48();
46*5c6c1daeSBarry Smith #endif
47*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
48*5c6c1daeSBarry Smith }
49*5c6c1daeSBarry Smith 
50*5c6c1daeSBarry Smith static struct _PetscRandomOps PetscRandomOps_Values = {
51*5c6c1daeSBarry Smith   /* 0 */
52*5c6c1daeSBarry Smith   PetscRandomSeed_Rand48,
53*5c6c1daeSBarry Smith   PetscRandomGetValue_Rand48,
54*5c6c1daeSBarry Smith   PetscRandomGetValueReal_Rand48,
55*5c6c1daeSBarry Smith   0,
56*5c6c1daeSBarry Smith   /* 5 */
57*5c6c1daeSBarry Smith   0
58*5c6c1daeSBarry Smith };
59*5c6c1daeSBarry Smith 
60*5c6c1daeSBarry Smith /*MC
61*5c6c1daeSBarry Smith    PETSCRAND48 - access to the basic Unix drand48() random number generator
62*5c6c1daeSBarry Smith 
63*5c6c1daeSBarry Smith    Options Database Keys:
64*5c6c1daeSBarry Smith . -random_type <rand,rand48,sprng>
65*5c6c1daeSBarry Smith 
66*5c6c1daeSBarry Smith   Level: beginner
67*5c6c1daeSBarry Smith 
68*5c6c1daeSBarry Smith .seealso: RandomCreate(), RandomSetType(), PETSCRAND, PETSCSPRNG
69*5c6c1daeSBarry Smith M*/
70*5c6c1daeSBarry Smith 
71*5c6c1daeSBarry Smith EXTERN_C_BEGIN
72*5c6c1daeSBarry Smith #undef __FUNCT__
73*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomCreate_Rand48"
74*5c6c1daeSBarry Smith PetscErrorCode  PetscRandomCreate_Rand48(PetscRandom r)
75*5c6c1daeSBarry Smith {
76*5c6c1daeSBarry Smith   PetscErrorCode ierr;
77*5c6c1daeSBarry Smith 
78*5c6c1daeSBarry Smith   PetscFunctionBegin;
79*5c6c1daeSBarry Smith   ierr = PetscMemcpy(r->ops,&PetscRandomOps_Values,sizeof(PetscRandomOps_Values));CHKERRQ(ierr);
80*5c6c1daeSBarry Smith   /* r->bops->publish   = PetscRandomPublish; */
81*5c6c1daeSBarry Smith   /*  r->petscnative     = PETSC_TRUE;  */
82*5c6c1daeSBarry Smith 
83*5c6c1daeSBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)r,PETSCRAND48);CHKERRQ(ierr);
84*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
85*5c6c1daeSBarry Smith }
86*5c6c1daeSBarry Smith EXTERN_C_END
87