xref: /petsc/src/sys/classes/random/impls/rand/rand.c (revision d6cc78556ab04a56a44675a863612015b01f30e2)
15c6c1daeSBarry Smith 
2*d6cc7855SJacob Faibussowitsch #include <petsc/private/randomimpl.h>
35c6c1daeSBarry Smith 
45c6c1daeSBarry Smith PetscErrorCode  PetscRandomSeed_Rand(PetscRandom r)
55c6c1daeSBarry Smith {
65c6c1daeSBarry Smith   PetscFunctionBegin;
75c6c1daeSBarry Smith   srand(r->seed);
85c6c1daeSBarry Smith   PetscFunctionReturn(0);
95c6c1daeSBarry Smith }
105c6c1daeSBarry Smith 
115c6c1daeSBarry Smith #define RAND_WRAP ((PetscReal)((rand()/(double)((unsigned int)RAND_MAX+1))))
125c6c1daeSBarry Smith PetscErrorCode  PetscRandomGetValue_Rand(PetscRandom r,PetscScalar *val)
135c6c1daeSBarry Smith {
145c6c1daeSBarry Smith   PetscFunctionBegin;
155c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
16b0043f70SBarry Smith   if (r->iset) *val = PetscRealPart(r->width)*RAND_WRAP + PetscRealPart(r->low) + (PetscImaginaryPart(r->width)*RAND_WRAP + PetscImaginaryPart(r->low)) * PETSC_i;
175c6c1daeSBarry Smith   else *val = RAND_WRAP + RAND_WRAP*PETSC_i;
185c6c1daeSBarry Smith #else
195c6c1daeSBarry Smith   if (r->iset) *val = r->width * RAND_WRAP + r->low;
205c6c1daeSBarry Smith   else         *val = RAND_WRAP;
215c6c1daeSBarry Smith #endif
225c6c1daeSBarry Smith   PetscFunctionReturn(0);
235c6c1daeSBarry Smith }
245c6c1daeSBarry Smith 
255c6c1daeSBarry Smith PetscErrorCode  PetscRandomGetValueReal_Rand(PetscRandom r,PetscReal *val)
265c6c1daeSBarry Smith {
275c6c1daeSBarry Smith   PetscFunctionBegin;
285c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
295c6c1daeSBarry Smith     if (r->iset) *val = PetscRealPart(r->width)*RAND_WRAP + PetscRealPart(r->low);
305c6c1daeSBarry Smith     else         *val = RAND_WRAP;
315c6c1daeSBarry Smith #else
325c6c1daeSBarry Smith   if (r->iset) *val = r->width * RAND_WRAP + r->low;
335c6c1daeSBarry Smith   else         *val = RAND_WRAP;
345c6c1daeSBarry Smith #endif
355c6c1daeSBarry Smith   PetscFunctionReturn(0);
365c6c1daeSBarry Smith }
375c6c1daeSBarry Smith 
385c6c1daeSBarry Smith static struct _PetscRandomOps PetscRandomOps_Values = {
395c6c1daeSBarry Smith   PetscRandomSeed_Rand,
405c6c1daeSBarry Smith   PetscRandomGetValue_Rand,
415c6c1daeSBarry Smith   PetscRandomGetValueReal_Rand,
4202c9f0b5SLisandro Dalcin   NULL,
43808ba619SStefano Zampini   NULL,
44808ba619SStefano Zampini   NULL,
4502c9f0b5SLisandro Dalcin   NULL
465c6c1daeSBarry Smith };
475c6c1daeSBarry Smith 
485c6c1daeSBarry Smith /*MC
495c6c1daeSBarry Smith    PETSCRAND - access to the basic Unix random number generator
505c6c1daeSBarry Smith 
515c6c1daeSBarry Smith    Options Database Keys:
525c6c1daeSBarry Smith . -random_type <rand,rand48,sprng>
535c6c1daeSBarry Smith 
545c6c1daeSBarry Smith   Level: beginner
555c6c1daeSBarry Smith 
56808ba619SStefano Zampini .seealso: PetscRandomCreate(), PetscRandomSetType(), PETSCRAND48, PETSCSPRNG
575c6c1daeSBarry Smith M*/
585c6c1daeSBarry Smith 
598cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom r)
605c6c1daeSBarry Smith {
615c6c1daeSBarry Smith   PetscErrorCode ierr;
625c6c1daeSBarry Smith 
635c6c1daeSBarry Smith   PetscFunctionBegin;
645c6c1daeSBarry Smith   ierr = PetscMemcpy(r->ops,&PetscRandomOps_Values,sizeof(PetscRandomOps_Values));CHKERRQ(ierr);
655c6c1daeSBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)r,PETSCRAND);CHKERRQ(ierr);
665c6c1daeSBarry Smith   PetscFunctionReturn(0);
675c6c1daeSBarry Smith }
68