xref: /petsc/src/sys/classes/random/impls/rand/rand.c (revision 811af0c4b09a35de4306c442f88bd09fdc09897d)
15c6c1daeSBarry Smith 
2d6cc7855SJacob Faibussowitsch #include <petsc/private/randomimpl.h>
35c6c1daeSBarry Smith 
49371c9d4SSatish 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))))
119371c9d4SSatish 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 
239371c9d4SSatish 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 
49*811af0c4SBarry Smith   Note:
50*811af0c4SBarry Smith   Not recommended since it can produce different numbers on different systems
51*811af0c4SBarry Smith 
52*811af0c4SBarry Smith .seealso: `PetscRandomCreate()`, `PetscRandomSetType()`, `PETSCRAND48`, `PETSCSPRNG`, `PetscRandomSetFromOptions()`, `PetscRandomType`
535c6c1daeSBarry Smith M*/
545c6c1daeSBarry Smith 
559371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom r) {
565c6c1daeSBarry Smith   PetscFunctionBegin;
579566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(r->ops, &PetscRandomOps_Values, sizeof(PetscRandomOps_Values)));
589566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)r, PETSCRAND));
595c6c1daeSBarry Smith   PetscFunctionReturn(0);
605c6c1daeSBarry Smith }
61