xref: /petsc/src/sys/classes/random/impls/rand/rand.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_Rand"
95c6c1daeSBarry Smith PetscErrorCode  PetscRandomSeed_Rand(PetscRandom r)
105c6c1daeSBarry Smith {
115c6c1daeSBarry Smith   PetscFunctionBegin;
125c6c1daeSBarry Smith   srand(r->seed);
135c6c1daeSBarry Smith   PetscFunctionReturn(0);
145c6c1daeSBarry Smith }
155c6c1daeSBarry Smith 
165c6c1daeSBarry Smith #define RAND_WRAP ((PetscReal)((rand()/(double)((unsigned int)RAND_MAX+1))))
175c6c1daeSBarry Smith #undef __FUNCT__
185c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomGetValue_Rand"
195c6c1daeSBarry Smith PetscErrorCode  PetscRandomGetValue_Rand(PetscRandom r,PetscScalar *val)
205c6c1daeSBarry Smith {
215c6c1daeSBarry Smith   PetscFunctionBegin;
225c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
23*b0043f70SBarry Smith   if (r->iset) *val = PetscRealPart(r->width)*RAND_WRAP + PetscRealPart(r->low) + (PetscImaginaryPart(r->width)*RAND_WRAP + PetscImaginaryPart(r->low)) * PETSC_i;
245c6c1daeSBarry Smith   else *val = RAND_WRAP + RAND_WRAP*PETSC_i;
255c6c1daeSBarry Smith #else
265c6c1daeSBarry Smith   if (r->iset) *val = r->width * RAND_WRAP + r->low;
275c6c1daeSBarry Smith   else         *val = RAND_WRAP;
285c6c1daeSBarry Smith #endif
295c6c1daeSBarry Smith   PetscFunctionReturn(0);
305c6c1daeSBarry Smith }
315c6c1daeSBarry Smith 
325c6c1daeSBarry Smith #undef __FUNCT__
335c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomGetValueReal_Rand"
345c6c1daeSBarry Smith PetscErrorCode  PetscRandomGetValueReal_Rand(PetscRandom r,PetscReal *val)
355c6c1daeSBarry Smith {
365c6c1daeSBarry Smith   PetscFunctionBegin;
375c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
385c6c1daeSBarry Smith     if (r->iset) *val = PetscRealPart(r->width)*RAND_WRAP + PetscRealPart(r->low);
395c6c1daeSBarry Smith     else         *val = RAND_WRAP;
405c6c1daeSBarry Smith #else
415c6c1daeSBarry Smith   if (r->iset) *val = r->width * RAND_WRAP + r->low;
425c6c1daeSBarry Smith   else         *val = RAND_WRAP;
435c6c1daeSBarry Smith #endif
445c6c1daeSBarry Smith   PetscFunctionReturn(0);
455c6c1daeSBarry Smith }
465c6c1daeSBarry Smith 
475c6c1daeSBarry Smith static struct _PetscRandomOps PetscRandomOps_Values = {
485c6c1daeSBarry Smith   /* 0 */
495c6c1daeSBarry Smith   PetscRandomSeed_Rand,
505c6c1daeSBarry Smith   PetscRandomGetValue_Rand,
515c6c1daeSBarry Smith   PetscRandomGetValueReal_Rand,
525c6c1daeSBarry Smith    0,
535c6c1daeSBarry Smith   /* 5 */
545c6c1daeSBarry Smith   0
555c6c1daeSBarry Smith };
565c6c1daeSBarry Smith 
575c6c1daeSBarry Smith /*MC
585c6c1daeSBarry Smith    PETSCRAND - access to the basic Unix random number generator
595c6c1daeSBarry Smith 
605c6c1daeSBarry Smith    Options Database Keys:
615c6c1daeSBarry Smith . -random_type <rand,rand48,sprng>
625c6c1daeSBarry Smith 
635c6c1daeSBarry Smith   Level: beginner
645c6c1daeSBarry Smith 
655c6c1daeSBarry Smith .seealso: RandomCreate(), RandomSetType(), PETSCRAND48, PETSCSPRNG
665c6c1daeSBarry Smith M*/
675c6c1daeSBarry Smith 
685c6c1daeSBarry Smith EXTERN_C_BEGIN
695c6c1daeSBarry Smith #undef __FUNCT__
705c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomCreate_Rand"
715c6c1daeSBarry Smith PetscErrorCode  PetscRandomCreate_Rand(PetscRandom r)
725c6c1daeSBarry Smith {
735c6c1daeSBarry Smith   PetscErrorCode ierr;
745c6c1daeSBarry Smith 
755c6c1daeSBarry Smith   PetscFunctionBegin;
765c6c1daeSBarry Smith   ierr = PetscMemcpy(r->ops,&PetscRandomOps_Values,sizeof(PetscRandomOps_Values));CHKERRQ(ierr);
775c6c1daeSBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)r,PETSCRAND);CHKERRQ(ierr);
785c6c1daeSBarry Smith   PetscFunctionReturn(0);
795c6c1daeSBarry Smith }
805c6c1daeSBarry Smith EXTERN_C_END
81