xref: /petsc/src/sys/classes/random/impls/rand48/rand48.c (revision b0043f701616b3f2f8d3dcb8857530d8692d5c06)
15c6c1daeSBarry Smith 
25c6c1daeSBarry Smith #include <../src/sys/classes/random/randomimpl.h>
35c6c1daeSBarry Smith #if defined (PETSC_HAVE_STDLIB_H)
45c6c1daeSBarry Smith #include <stdlib.h>
55c6c1daeSBarry Smith #endif
65c6c1daeSBarry Smith 
75c6c1daeSBarry Smith #undef __FUNCT__
85c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomSeed_Rand48"
95c6c1daeSBarry Smith PetscErrorCode  PetscRandomSeed_Rand48(PetscRandom r)
105c6c1daeSBarry Smith {
115c6c1daeSBarry Smith   PetscFunctionBegin;
125c6c1daeSBarry Smith   srand48(r->seed);
135c6c1daeSBarry Smith   PetscFunctionReturn(0);
145c6c1daeSBarry Smith }
155c6c1daeSBarry Smith 
165c6c1daeSBarry Smith #undef __FUNCT__
175c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomGetValue_Rand48"
185c6c1daeSBarry Smith PetscErrorCode  PetscRandomGetValue_Rand48(PetscRandom r,PetscScalar *val)
195c6c1daeSBarry Smith {
205c6c1daeSBarry Smith   PetscFunctionBegin;
215c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
225c6c1daeSBarry Smith   if (r->iset) {
23*b0043f70SBarry Smith     *val = PetscRealPart(r->width)*(PetscReal)drand48() + PetscRealPart(r->low) + (PetscImaginaryPart(r->width)*(PetscReal)drand48() + PetscImaginaryPart(r->low)) * PETSC_i;
245c6c1daeSBarry Smith   } else {
255c6c1daeSBarry Smith     *val = (PetscReal)drand48() + (PetscReal)drand48()*PETSC_i;
265c6c1daeSBarry Smith   }
275c6c1daeSBarry Smith #else
285c6c1daeSBarry Smith   if (r->iset) *val = r->width * drand48() + r->low;
295c6c1daeSBarry Smith   else         *val = drand48();
305c6c1daeSBarry Smith #endif
315c6c1daeSBarry Smith   PetscFunctionReturn(0);
325c6c1daeSBarry Smith }
335c6c1daeSBarry Smith 
345c6c1daeSBarry Smith #undef __FUNCT__
355c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomGetValueReal_Rand48"
365c6c1daeSBarry Smith PetscErrorCode  PetscRandomGetValueReal_Rand48(PetscRandom r,PetscReal *val)
375c6c1daeSBarry Smith {
385c6c1daeSBarry Smith   PetscFunctionBegin;
395c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
405c6c1daeSBarry Smith   if (r->iset) *val = PetscRealPart(r->width)*drand48() + PetscRealPart(r->low);
415c6c1daeSBarry Smith   else         *val = drand48();
425c6c1daeSBarry Smith #else
435c6c1daeSBarry Smith   if (r->iset) *val = r->width * drand48() + r->low;
445c6c1daeSBarry Smith   else         *val = drand48();
455c6c1daeSBarry Smith #endif
465c6c1daeSBarry Smith   PetscFunctionReturn(0);
475c6c1daeSBarry Smith }
485c6c1daeSBarry Smith 
495c6c1daeSBarry Smith static struct _PetscRandomOps PetscRandomOps_Values = {
505c6c1daeSBarry Smith   /* 0 */
515c6c1daeSBarry Smith   PetscRandomSeed_Rand48,
525c6c1daeSBarry Smith   PetscRandomGetValue_Rand48,
535c6c1daeSBarry Smith   PetscRandomGetValueReal_Rand48,
545c6c1daeSBarry Smith   0,
555c6c1daeSBarry Smith   /* 5 */
565c6c1daeSBarry Smith   0
575c6c1daeSBarry Smith };
585c6c1daeSBarry Smith 
595c6c1daeSBarry Smith /*MC
605c6c1daeSBarry Smith    PETSCRAND48 - access to the basic Unix drand48() random number generator
615c6c1daeSBarry Smith 
625c6c1daeSBarry Smith    Options Database Keys:
635c6c1daeSBarry Smith . -random_type <rand,rand48,sprng>
645c6c1daeSBarry Smith 
655c6c1daeSBarry Smith   Level: beginner
665c6c1daeSBarry Smith 
675c6c1daeSBarry Smith .seealso: RandomCreate(), RandomSetType(), PETSCRAND, PETSCSPRNG
685c6c1daeSBarry Smith M*/
695c6c1daeSBarry Smith 
705c6c1daeSBarry Smith EXTERN_C_BEGIN
715c6c1daeSBarry Smith #undef __FUNCT__
725c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomCreate_Rand48"
735c6c1daeSBarry Smith PetscErrorCode  PetscRandomCreate_Rand48(PetscRandom r)
745c6c1daeSBarry Smith {
755c6c1daeSBarry Smith   PetscErrorCode ierr;
765c6c1daeSBarry Smith 
775c6c1daeSBarry Smith   PetscFunctionBegin;
785c6c1daeSBarry Smith   ierr = PetscMemcpy(r->ops,&PetscRandomOps_Values,sizeof(PetscRandomOps_Values));CHKERRQ(ierr);
795c6c1daeSBarry Smith   /* r->bops->publish   = PetscRandomPublish; */
805c6c1daeSBarry Smith   /*  r->petscnative     = PETSC_TRUE;  */
815c6c1daeSBarry Smith 
825c6c1daeSBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)r,PETSCRAND48);CHKERRQ(ierr);
835c6c1daeSBarry Smith   PetscFunctionReturn(0);
845c6c1daeSBarry Smith }
855c6c1daeSBarry Smith EXTERN_C_END
86