xref: /petsc/src/sys/classes/random/impls/sprng/sprng.c (revision 5c6c1daec53e1d9ab0bec9db5309fd8fc7645b8d)
1*5c6c1daeSBarry Smith 
2*5c6c1daeSBarry Smith #include <../src/sys/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 #define USE_MPI
8*5c6c1daeSBarry Smith #define SIMPLE_SPRNG
9*5c6c1daeSBarry Smith EXTERN_C_BEGIN
10*5c6c1daeSBarry Smith #include <sprng.h>
11*5c6c1daeSBarry Smith EXTERN_C_END
12*5c6c1daeSBarry Smith 
13*5c6c1daeSBarry Smith #undef __FUNCT__
14*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomSeed_Sprng"
15*5c6c1daeSBarry Smith PetscErrorCode  PetscRandomSeed_Sprng(PetscRandom r)
16*5c6c1daeSBarry Smith {
17*5c6c1daeSBarry Smith   PetscFunctionBegin;
18*5c6c1daeSBarry Smith   init_sprng(r->seed,SPRNG_DEFAULT);
19*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
20*5c6c1daeSBarry Smith }
21*5c6c1daeSBarry Smith 
22*5c6c1daeSBarry Smith #undef __FUNCT__
23*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomGetValue_Sprng"
24*5c6c1daeSBarry Smith PetscErrorCode  PetscRandomGetValue_Sprng(PetscRandom r,PetscScalar *val)
25*5c6c1daeSBarry Smith {
26*5c6c1daeSBarry Smith   PetscFunctionBegin;
27*5c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
28*5c6c1daeSBarry Smith   if (r->iset) {
29*5c6c1daeSBarry Smith     *val = PetscRealPart(r->width)*sprng() + PetscRealPart(r->low) +
30*5c6c1daeSBarry Smith       (PetscImaginaryPart(r->width)*sprng() + PetscImaginaryPart(r->low)) * PETSC_i;
31*5c6c1daeSBarry Smith   } else {
32*5c6c1daeSBarry Smith     *val = sprng() + sprng()*PETSC_i;
33*5c6c1daeSBarry Smith   }
34*5c6c1daeSBarry Smith #else
35*5c6c1daeSBarry Smith   if (r->iset) *val = r->width * sprng() + r->low;
36*5c6c1daeSBarry Smith   else         *val = sprng();
37*5c6c1daeSBarry Smith #endif
38*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
39*5c6c1daeSBarry Smith }
40*5c6c1daeSBarry Smith 
41*5c6c1daeSBarry Smith #undef __FUNCT__
42*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomGetValue_Sprng"
43*5c6c1daeSBarry Smith PetscErrorCode  PetscRandomGetValueReal_Sprng(PetscRandom r,PetscScalar *val)
44*5c6c1daeSBarry Smith {
45*5c6c1daeSBarry Smith   PetscFunctionBegin;
46*5c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
47*5c6c1daeSBarry Smith   if (r->iset) *val = PetscRealPart(r->width)*sprng() + PetscRealPart(r->low);
48*5c6c1daeSBarry Smith   else         *val = sprng();
49*5c6c1daeSBarry Smith #else
50*5c6c1daeSBarry Smith   if (r->iset) *val = r->width * sprng() + r->low;
51*5c6c1daeSBarry Smith   else         *val = sprng();
52*5c6c1daeSBarry Smith #endif
53*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
54*5c6c1daeSBarry Smith }
55*5c6c1daeSBarry Smith 
56*5c6c1daeSBarry Smith static struct _PetscRandomOps PetscRandomOps_Values = {
57*5c6c1daeSBarry Smith   /* 0 */
58*5c6c1daeSBarry Smith   PetscRandomSeed_Sprng,
59*5c6c1daeSBarry Smith   PetscRandomGetValue_Sprng,
60*5c6c1daeSBarry Smith   PetscRandomGetValueReal_Sprng,
61*5c6c1daeSBarry Smith   0,
62*5c6c1daeSBarry Smith   /* 5 */
63*5c6c1daeSBarry Smith   0
64*5c6c1daeSBarry Smith };
65*5c6c1daeSBarry Smith 
66*5c6c1daeSBarry Smith /*MC
67*5c6c1daeSBarry Smith    PETSCSPRNG- access to the publically available random number generator sprng
68*5c6c1daeSBarry Smith 
69*5c6c1daeSBarry Smith    Options Database Keys:
70*5c6c1daeSBarry Smith . -random_type <rand,rand48,sprng>
71*5c6c1daeSBarry Smith 
72*5c6c1daeSBarry Smith   Level: beginner
73*5c6c1daeSBarry Smith 
74*5c6c1daeSBarry Smith    PETSc must have been ./configure with the option --download-sprng to use
75*5c6c1daeSBarry Smith    this random number generator.
76*5c6c1daeSBarry Smith 
77*5c6c1daeSBarry Smith    This is NOT currently using a parallel random number generator. Sprng does have
78*5c6c1daeSBarry Smith    an MPI version we should investigate.
79*5c6c1daeSBarry Smith 
80*5c6c1daeSBarry Smith .seealso: RandomCreate(), RandomSetType(), PETSCRAND, PETSCRAND48
81*5c6c1daeSBarry Smith M*/
82*5c6c1daeSBarry Smith 
83*5c6c1daeSBarry Smith EXTERN_C_BEGIN
84*5c6c1daeSBarry Smith #undef __FUNCT__
85*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomCreate_Sprng"
86*5c6c1daeSBarry Smith PetscErrorCode  PetscRandomCreate_Sprng(PetscRandom r)
87*5c6c1daeSBarry Smith {
88*5c6c1daeSBarry Smith   PetscErrorCode ierr;
89*5c6c1daeSBarry Smith 
90*5c6c1daeSBarry Smith   PetscFunctionBegin;
91*5c6c1daeSBarry Smith   ierr = PetscMemcpy(r->ops,&PetscRandomOps_Values,sizeof(PetscRandomOps_Values));CHKERRQ(ierr);
92*5c6c1daeSBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)r,PETSCSPRNG);CHKERRQ(ierr);
93*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
94*5c6c1daeSBarry Smith }
95*5c6c1daeSBarry Smith EXTERN_C_END
96