xref: /petsc/src/sys/classes/random/impls/rand/rand.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
15c6c1daeSBarry Smith 
2d6cc7855SJacob Faibussowitsch #include <petsc/private/randomimpl.h>
35c6c1daeSBarry Smith 
4*9371c9d4SSatish Balay PetscErrorCode PetscRandomSeed_Rand(PetscRandom r) {
55c6c1daeSBarry Smith   PetscFunctionBegin;
65c6c1daeSBarry Smith   srand(r->seed);
75c6c1daeSBarry Smith   PetscFunctionReturn(0);
85c6c1daeSBarry Smith }
95c6c1daeSBarry Smith 
105c6c1daeSBarry Smith #define RAND_WRAP ((PetscReal)((rand() / (double)((unsigned int)RAND_MAX + 1))))
11*9371c9d4SSatish Balay PetscErrorCode PetscRandomGetValue_Rand(PetscRandom r, PetscScalar *val) {
125c6c1daeSBarry Smith   PetscFunctionBegin;
135c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
14b0043f70SBarry Smith   if (r->iset) *val = PetscRealPart(r->width) * RAND_WRAP + PetscRealPart(r->low) + (PetscImaginaryPart(r->width) * RAND_WRAP + PetscImaginaryPart(r->low)) * PETSC_i;
155c6c1daeSBarry Smith   else *val = RAND_WRAP + RAND_WRAP * PETSC_i;
165c6c1daeSBarry Smith #else
175c6c1daeSBarry Smith   if (r->iset) *val = r->width * RAND_WRAP + r->low;
185c6c1daeSBarry Smith   else *val = RAND_WRAP;
195c6c1daeSBarry Smith #endif
205c6c1daeSBarry Smith   PetscFunctionReturn(0);
215c6c1daeSBarry Smith }
225c6c1daeSBarry Smith 
23*9371c9d4SSatish Balay PetscErrorCode PetscRandomGetValueReal_Rand(PetscRandom r, PetscReal *val) {
245c6c1daeSBarry Smith   PetscFunctionBegin;
255c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
265c6c1daeSBarry Smith   if (r->iset) *val = PetscRealPart(r->width) * RAND_WRAP + PetscRealPart(r->low);
275c6c1daeSBarry Smith   else *val = RAND_WRAP;
285c6c1daeSBarry Smith #else
295c6c1daeSBarry Smith   if (r->iset) *val = r->width * RAND_WRAP + r->low;
305c6c1daeSBarry Smith   else *val = RAND_WRAP;
315c6c1daeSBarry Smith #endif
325c6c1daeSBarry Smith   PetscFunctionReturn(0);
335c6c1daeSBarry Smith }
345c6c1daeSBarry Smith 
355c6c1daeSBarry Smith static struct _PetscRandomOps PetscRandomOps_Values = {
36267267bdSJacob Faibussowitsch   PetscDesignatedInitializer(seed, PetscRandomSeed_Rand),
37267267bdSJacob Faibussowitsch   PetscDesignatedInitializer(getvalue, PetscRandomGetValue_Rand),
38267267bdSJacob Faibussowitsch   PetscDesignatedInitializer(getvaluereal, PetscRandomGetValueReal_Rand),
395c6c1daeSBarry Smith };
405c6c1daeSBarry Smith 
415c6c1daeSBarry Smith /*MC
425c6c1daeSBarry Smith    PETSCRAND - access to the basic Unix random number generator
435c6c1daeSBarry Smith 
445c6c1daeSBarry Smith    Options Database Keys:
451179163eSBarry Smith . -random_type <rand,rand48,sprng> - set the random number generator from the options database
465c6c1daeSBarry Smith 
475c6c1daeSBarry Smith   Level: beginner
485c6c1daeSBarry Smith 
491179163eSBarry Smith .seealso: `PetscRandomCreate()`, `PetscRandomSetType()`, `PETSCRAND48`, `PETSCSPRNG`, `PetscRandomSetFromOptions()`
505c6c1daeSBarry Smith M*/
515c6c1daeSBarry Smith 
52*9371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom r) {
535c6c1daeSBarry Smith   PetscFunctionBegin;
549566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(r->ops, &PetscRandomOps_Values, sizeof(PetscRandomOps_Values)));
559566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)r, PETSCRAND));
565c6c1daeSBarry Smith   PetscFunctionReturn(0);
575c6c1daeSBarry Smith }
58