xref: /petsc/src/sys/classes/random/impls/rand/rand.c (revision 3ba1676111f5c958fe6c2729b46ca4d523958bb3)
15c6c1daeSBarry Smith 
2d6cc7855SJacob Faibussowitsch #include <petsc/private/randomimpl.h>
35c6c1daeSBarry Smith 
4d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomSeed_Rand(PetscRandom r)
5d71ae5a4SJacob Faibussowitsch {
65c6c1daeSBarry Smith   PetscFunctionBegin;
75c6c1daeSBarry Smith   srand(r->seed);
8*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
95c6c1daeSBarry Smith }
105c6c1daeSBarry Smith 
115c6c1daeSBarry Smith #define RAND_WRAP ((PetscReal)((rand() / (double)((unsigned int)RAND_MAX + 1))))
12d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomGetValue_Rand(PetscRandom r, PetscScalar *val)
13d71ae5a4SJacob Faibussowitsch {
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
22*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
235c6c1daeSBarry Smith }
245c6c1daeSBarry Smith 
25d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomGetValueReal_Rand(PetscRandom r, PetscReal *val)
26d71ae5a4SJacob Faibussowitsch {
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
35*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
365c6c1daeSBarry Smith }
375c6c1daeSBarry Smith 
385c6c1daeSBarry Smith static struct _PetscRandomOps PetscRandomOps_Values = {
39267267bdSJacob Faibussowitsch   PetscDesignatedInitializer(seed, PetscRandomSeed_Rand),
40267267bdSJacob Faibussowitsch   PetscDesignatedInitializer(getvalue, PetscRandomGetValue_Rand),
41267267bdSJacob Faibussowitsch   PetscDesignatedInitializer(getvaluereal, PetscRandomGetValueReal_Rand),
425c6c1daeSBarry Smith };
435c6c1daeSBarry Smith 
445c6c1daeSBarry Smith /*MC
455c6c1daeSBarry Smith    PETSCRAND - access to the basic Unix random number generator
465c6c1daeSBarry Smith 
475c6c1daeSBarry Smith    Options Database Keys:
481179163eSBarry Smith . -random_type <rand,rand48,sprng> - set the random number generator from the options database
495c6c1daeSBarry Smith 
505c6c1daeSBarry Smith   Level: beginner
515c6c1daeSBarry Smith 
52811af0c4SBarry Smith   Note:
53811af0c4SBarry Smith   Not recommended since it can produce different numbers on different systems
54811af0c4SBarry Smith 
55811af0c4SBarry Smith .seealso: `PetscRandomCreate()`, `PetscRandomSetType()`, `PETSCRAND48`, `PETSCSPRNG`, `PetscRandomSetFromOptions()`, `PetscRandomType`
565c6c1daeSBarry Smith M*/
575c6c1daeSBarry Smith 
58d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom r)
59d71ae5a4SJacob Faibussowitsch {
605c6c1daeSBarry Smith   PetscFunctionBegin;
619566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(r->ops, &PetscRandomOps_Values, sizeof(PetscRandomOps_Values)));
629566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)r, PETSCRAND));
63*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
645c6c1daeSBarry Smith }
65