xref: /petsc/src/sys/classes/random/impls/rand48/rand48.c (revision 267267bdcbfbae225216e8078da17f7ca9d5f149)
10039db0dSBarry Smith #define PETSC_DESIRE_FEATURE_TEST_MACROS /* for drand48() */
2d6cc7855SJacob Faibussowitsch #include <petsc/private/randomimpl.h>
35c6c1daeSBarry Smith 
45c6c1daeSBarry Smith PetscErrorCode  PetscRandomSeed_Rand48(PetscRandom r)
55c6c1daeSBarry Smith {
65c6c1daeSBarry Smith   PetscFunctionBegin;
75c6c1daeSBarry Smith   srand48(r->seed);
85c6c1daeSBarry Smith   PetscFunctionReturn(0);
95c6c1daeSBarry Smith }
105c6c1daeSBarry Smith 
115c6c1daeSBarry Smith PetscErrorCode  PetscRandomGetValue_Rand48(PetscRandom r,PetscScalar *val)
125c6c1daeSBarry Smith {
135c6c1daeSBarry Smith   PetscFunctionBegin;
145c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
155c6c1daeSBarry Smith   if (r->iset) {
16b0043f70SBarry Smith     *val = PetscRealPart(r->width)*(PetscReal)drand48() + PetscRealPart(r->low) + (PetscImaginaryPart(r->width)*(PetscReal)drand48() + PetscImaginaryPart(r->low)) * PETSC_i;
175c6c1daeSBarry Smith   } else {
185c6c1daeSBarry Smith     *val = (PetscReal)drand48() + (PetscReal)drand48()*PETSC_i;
195c6c1daeSBarry Smith   }
205c6c1daeSBarry Smith #else
215c6c1daeSBarry Smith   if (r->iset) *val = r->width * drand48() + r->low;
225c6c1daeSBarry Smith   else         *val = drand48();
235c6c1daeSBarry Smith #endif
245c6c1daeSBarry Smith   PetscFunctionReturn(0);
255c6c1daeSBarry Smith }
265c6c1daeSBarry Smith 
275c6c1daeSBarry Smith PetscErrorCode  PetscRandomGetValueReal_Rand48(PetscRandom r,PetscReal *val)
285c6c1daeSBarry Smith {
295c6c1daeSBarry Smith   PetscFunctionBegin;
305c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
315c6c1daeSBarry Smith   if (r->iset) *val = PetscRealPart(r->width)*drand48() + PetscRealPart(r->low);
325c6c1daeSBarry Smith   else         *val = drand48();
335c6c1daeSBarry Smith #else
345c6c1daeSBarry Smith   if (r->iset) *val = r->width * drand48() + r->low;
355c6c1daeSBarry Smith   else         *val = drand48();
365c6c1daeSBarry Smith #endif
375c6c1daeSBarry Smith   PetscFunctionReturn(0);
385c6c1daeSBarry Smith }
395c6c1daeSBarry Smith 
405c6c1daeSBarry Smith static struct _PetscRandomOps PetscRandomOps_Values = {
41*267267bdSJacob Faibussowitsch   PetscDesignatedInitializer(seed,PetscRandomSeed_Rand48),
42*267267bdSJacob Faibussowitsch   PetscDesignatedInitializer(getvalue,PetscRandomGetValue_Rand48),
43*267267bdSJacob Faibussowitsch   PetscDesignatedInitializer(getvaluereal,PetscRandomGetValueReal_Rand48),
445c6c1daeSBarry Smith };
455c6c1daeSBarry Smith 
465c6c1daeSBarry Smith /*MC
475c6c1daeSBarry Smith    PETSCRAND48 - access to the basic Unix drand48() random number generator
485c6c1daeSBarry Smith 
495c6c1daeSBarry Smith    Options Database Keys:
505c6c1daeSBarry Smith . -random_type <rand,rand48,sprng>
515c6c1daeSBarry Smith 
525c6c1daeSBarry Smith   Level: beginner
535c6c1daeSBarry Smith 
54808ba619SStefano Zampini .seealso: PetscRandomCreate(), PetscRandomSetType(), PETSCRAND, PETSCSPRNG
555c6c1daeSBarry Smith M*/
565c6c1daeSBarry Smith 
578cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand48(PetscRandom r)
585c6c1daeSBarry Smith {
595c6c1daeSBarry Smith   PetscErrorCode ierr;
605c6c1daeSBarry Smith 
615c6c1daeSBarry Smith   PetscFunctionBegin;
625c6c1daeSBarry Smith   ierr = PetscMemcpy(r->ops,&PetscRandomOps_Values,sizeof(PetscRandomOps_Values));CHKERRQ(ierr);
635c6c1daeSBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)r,PETSCRAND48);CHKERRQ(ierr);
645c6c1daeSBarry Smith   PetscFunctionReturn(0);
655c6c1daeSBarry Smith }
66