xref: /petsc/src/sys/classes/random/impls/rand/rand.c (revision 3cb3609b6a296a92a70bbd05421941ba494f28de)
1d6cc7855SJacob Faibussowitsch #include <petsc/private/randomimpl.h>
25c6c1daeSBarry Smith 
PetscRandomSeed_Rand(PetscRandom r)366976f2fSJacob Faibussowitsch static PetscErrorCode PetscRandomSeed_Rand(PetscRandom r)
4d71ae5a4SJacob Faibussowitsch {
55c6c1daeSBarry Smith   PetscFunctionBegin;
66497c311SBarry Smith   srand((unsigned int)r->seed);
73ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
85c6c1daeSBarry Smith }
95c6c1daeSBarry Smith 
10f4f49eeaSPierre Jolivet #define RAND_WRAP ((PetscReal)(rand() / (double)((unsigned int)RAND_MAX + 1)))
PetscRandomGetValue_Rand(PetscRandom r,PetscScalar * val)1166976f2fSJacob Faibussowitsch static PetscErrorCode PetscRandomGetValue_Rand(PetscRandom r, PetscScalar *val)
12d71ae5a4SJacob Faibussowitsch {
135c6c1daeSBarry Smith   PetscFunctionBegin;
145c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
15b0043f70SBarry Smith   if (r->iset) *val = PetscRealPart(r->width) * RAND_WRAP + PetscRealPart(r->low) + (PetscImaginaryPart(r->width) * RAND_WRAP + PetscImaginaryPart(r->low)) * PETSC_i;
165c6c1daeSBarry Smith   else *val = RAND_WRAP + RAND_WRAP * PETSC_i;
175c6c1daeSBarry Smith #else
185c6c1daeSBarry Smith   if (r->iset) *val = r->width * RAND_WRAP + r->low;
195c6c1daeSBarry Smith   else *val = RAND_WRAP;
205c6c1daeSBarry Smith #endif
213ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
225c6c1daeSBarry Smith }
235c6c1daeSBarry Smith 
PetscRandomGetValueReal_Rand(PetscRandom r,PetscReal * val)2466976f2fSJacob Faibussowitsch static PetscErrorCode PetscRandomGetValueReal_Rand(PetscRandom r, PetscReal *val)
25d71ae5a4SJacob Faibussowitsch {
265c6c1daeSBarry Smith   PetscFunctionBegin;
275c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
285c6c1daeSBarry Smith   if (r->iset) *val = PetscRealPart(r->width) * RAND_WRAP + PetscRealPart(r->low);
295c6c1daeSBarry Smith   else *val = RAND_WRAP;
305c6c1daeSBarry Smith #else
315c6c1daeSBarry Smith   if (r->iset) *val = r->width * RAND_WRAP + r->low;
325c6c1daeSBarry Smith   else *val = RAND_WRAP;
335c6c1daeSBarry Smith #endif
343ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
355c6c1daeSBarry Smith }
365c6c1daeSBarry Smith 
375c6c1daeSBarry Smith static struct _PetscRandomOps PetscRandomOps_Values = {
38267267bdSJacob Faibussowitsch   PetscDesignatedInitializer(seed, PetscRandomSeed_Rand),
39267267bdSJacob Faibussowitsch   PetscDesignatedInitializer(getvalue, PetscRandomGetValue_Rand),
40267267bdSJacob Faibussowitsch   PetscDesignatedInitializer(getvaluereal, PetscRandomGetValueReal_Rand),
41*8a403008SStefano Zampini   PetscDesignatedInitializer(getvalues, NULL),
42*8a403008SStefano Zampini   PetscDesignatedInitializer(getvaluesreal, NULL),
43*8a403008SStefano Zampini   PetscDesignatedInitializer(destroy, NULL),
44*8a403008SStefano Zampini   PetscDesignatedInitializer(setfromoptions, NULL),
455c6c1daeSBarry Smith };
465c6c1daeSBarry Smith 
475c6c1daeSBarry Smith /*MC
485c6c1daeSBarry Smith    PETSCRAND - access to the basic Unix random number generator
495c6c1daeSBarry Smith 
50c31d2375SBarry Smith    Options Database Key:
511179163eSBarry Smith . -random_type <rand,rand48,sprng> - set the random number generator from the options database
525c6c1daeSBarry Smith 
535c6c1daeSBarry Smith   Level: beginner
545c6c1daeSBarry Smith 
55811af0c4SBarry Smith   Note:
56811af0c4SBarry Smith   Not recommended since it can produce different numbers on different systems
57811af0c4SBarry Smith 
58811af0c4SBarry Smith .seealso: `PetscRandomCreate()`, `PetscRandomSetType()`, `PETSCRAND48`, `PETSCSPRNG`, `PetscRandomSetFromOptions()`, `PetscRandomType`
595c6c1daeSBarry Smith M*/
605c6c1daeSBarry Smith 
PetscRandomCreate_Rand(PetscRandom r)61d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom r)
62d71ae5a4SJacob Faibussowitsch {
635c6c1daeSBarry Smith   PetscFunctionBegin;
64aea10558SJacob Faibussowitsch   r->ops[0] = PetscRandomOps_Values;
659566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)r, PETSCRAND));
663ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
675c6c1daeSBarry Smith }
68