xref: /petsc/src/sys/classes/random/impls/rand48/rand48.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
10039db0dSBarry Smith #define PETSC_DESIRE_FEATURE_TEST_MACROS /* for drand48() */
2d6cc7855SJacob Faibussowitsch #include <petsc/private/randomimpl.h>
35c6c1daeSBarry Smith 
4*9371c9d4SSatish Balay PetscErrorCode PetscRandomSeed_Rand48(PetscRandom r) {
55c6c1daeSBarry Smith   PetscFunctionBegin;
65c6c1daeSBarry Smith   srand48(r->seed);
75c6c1daeSBarry Smith   PetscFunctionReturn(0);
85c6c1daeSBarry Smith }
95c6c1daeSBarry Smith 
10*9371c9d4SSatish Balay PetscErrorCode PetscRandomGetValue_Rand48(PetscRandom r, PetscScalar *val) {
115c6c1daeSBarry Smith   PetscFunctionBegin;
125c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
135c6c1daeSBarry Smith   if (r->iset) {
14b0043f70SBarry Smith     *val = PetscRealPart(r->width) * (PetscReal)drand48() + PetscRealPart(r->low) + (PetscImaginaryPart(r->width) * (PetscReal)drand48() + PetscImaginaryPart(r->low)) * PETSC_i;
155c6c1daeSBarry Smith   } else {
165c6c1daeSBarry Smith     *val = (PetscReal)drand48() + (PetscReal)drand48() * PETSC_i;
175c6c1daeSBarry Smith   }
185c6c1daeSBarry Smith #else
195c6c1daeSBarry Smith   if (r->iset) *val = r->width * drand48() + r->low;
205c6c1daeSBarry Smith   else *val = drand48();
215c6c1daeSBarry Smith #endif
225c6c1daeSBarry Smith   PetscFunctionReturn(0);
235c6c1daeSBarry Smith }
245c6c1daeSBarry Smith 
25*9371c9d4SSatish Balay PetscErrorCode PetscRandomGetValueReal_Rand48(PetscRandom r, PetscReal *val) {
265c6c1daeSBarry Smith   PetscFunctionBegin;
275c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
285c6c1daeSBarry Smith   if (r->iset) *val = PetscRealPart(r->width) * drand48() + PetscRealPart(r->low);
295c6c1daeSBarry Smith   else *val = drand48();
305c6c1daeSBarry Smith #else
315c6c1daeSBarry Smith   if (r->iset) *val = r->width * drand48() + r->low;
325c6c1daeSBarry Smith   else *val = drand48();
335c6c1daeSBarry Smith #endif
345c6c1daeSBarry Smith   PetscFunctionReturn(0);
355c6c1daeSBarry Smith }
365c6c1daeSBarry Smith 
375c6c1daeSBarry Smith static struct _PetscRandomOps PetscRandomOps_Values = {
38267267bdSJacob Faibussowitsch   PetscDesignatedInitializer(seed, PetscRandomSeed_Rand48),
39267267bdSJacob Faibussowitsch   PetscDesignatedInitializer(getvalue, PetscRandomGetValue_Rand48),
40267267bdSJacob Faibussowitsch   PetscDesignatedInitializer(getvaluereal, PetscRandomGetValueReal_Rand48),
415c6c1daeSBarry Smith };
425c6c1daeSBarry Smith 
435c6c1daeSBarry Smith /*MC
445c6c1daeSBarry Smith    PETSCRAND48 - access to the basic Unix drand48() random number generator
455c6c1daeSBarry Smith 
465c6c1daeSBarry Smith    Options Database Keys:
471179163eSBarry Smith . -random_type <rand,rand48,sprng> - select the random number generator at runtime
485c6c1daeSBarry Smith 
495c6c1daeSBarry Smith   Level: beginner
505c6c1daeSBarry Smith 
511179163eSBarry Smith   Notes:
521179163eSBarry Smith   Not recommended because it may produce different results on different systems.
531179163eSBarry Smith 
541179163eSBarry Smith .seealso: `PetscRandomCreate()`, `PetscRandomSetType()`, `PETSCRAND`, `PETSCSPRNG`, `PetscRandomSetFromOptions()`
555c6c1daeSBarry Smith M*/
565c6c1daeSBarry Smith 
57*9371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand48(PetscRandom r) {
585c6c1daeSBarry Smith   PetscFunctionBegin;
599566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(r->ops, &PetscRandomOps_Values, sizeof(PetscRandomOps_Values)));
609566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)r, PETSCRAND48));
615c6c1daeSBarry Smith   PetscFunctionReturn(0);
625c6c1daeSBarry Smith }
63