xref: /petsc/src/sys/classes/random/impls/sprng/sprng.c (revision 3ba1676111f5c958fe6c2729b46ca4d523958bb3)
15c6c1daeSBarry Smith 
2d6cc7855SJacob Faibussowitsch #include <petsc/private/randomimpl.h>
35c6c1daeSBarry Smith 
45c6c1daeSBarry Smith #define USE_MPI
55c6c1daeSBarry Smith #define SIMPLE_SPRNG
65c6c1daeSBarry Smith EXTERN_C_BEGIN
75c6c1daeSBarry Smith #include <sprng.h>
85c6c1daeSBarry Smith EXTERN_C_END
95c6c1daeSBarry Smith 
10d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomSeed_Sprng(PetscRandom r)
11d71ae5a4SJacob Faibussowitsch {
125c6c1daeSBarry Smith   PetscFunctionBegin;
135c6c1daeSBarry Smith   init_sprng(r->seed, SPRNG_DEFAULT);
14*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
155c6c1daeSBarry Smith }
165c6c1daeSBarry Smith 
17d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomGetValue_Sprng(PetscRandom r, PetscScalar *val)
18d71ae5a4SJacob Faibussowitsch {
195c6c1daeSBarry Smith   PetscFunctionBegin;
205c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
215c6c1daeSBarry Smith   if (r->iset) {
22b0043f70SBarry Smith     *val = PetscRealPart(r->width) * sprng() + PetscRealPart(r->low) + (PetscImaginaryPart(r->width) * sprng() + PetscImaginaryPart(r->low)) * PETSC_i;
235c6c1daeSBarry Smith   } else {
245c6c1daeSBarry Smith     *val = sprng() + sprng() * PETSC_i;
255c6c1daeSBarry Smith   }
265c6c1daeSBarry Smith #else
275c6c1daeSBarry Smith   if (r->iset) *val = r->width * sprng() + r->low;
285c6c1daeSBarry Smith   else *val = sprng();
295c6c1daeSBarry Smith #endif
30*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
315c6c1daeSBarry Smith }
325c6c1daeSBarry Smith 
33d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomGetValueReal_Sprng(PetscRandom r, PetscReal *val)
34d71ae5a4SJacob Faibussowitsch {
355c6c1daeSBarry Smith   PetscFunctionBegin;
365c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
375c6c1daeSBarry Smith   if (r->iset) *val = PetscRealPart(r->width) * sprng() + PetscRealPart(r->low);
385c6c1daeSBarry Smith   else *val = sprng();
395c6c1daeSBarry Smith #else
405c6c1daeSBarry Smith   if (r->iset) *val = r->width * sprng() + r->low;
415c6c1daeSBarry Smith   else *val = sprng();
425c6c1daeSBarry Smith #endif
43*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
445c6c1daeSBarry Smith }
455c6c1daeSBarry Smith 
465c6c1daeSBarry Smith static struct _PetscRandomOps PetscRandomOps_Values = {
47267267bdSJacob Faibussowitsch   PetscDesignatedInitializer(seed, PetscRandomSeed_Sprng),
48267267bdSJacob Faibussowitsch   PetscDesignatedInitializer(getvalue, PetscRandomGetValue_Sprng),
49267267bdSJacob Faibussowitsch   PetscDesignatedInitializer(getvaluereal, PetscRandomGetValueReal_Sprng),
505c6c1daeSBarry Smith };
515c6c1daeSBarry Smith 
525c6c1daeSBarry Smith /*MC
535c6c1daeSBarry Smith    PETSCSPRNG - access to the publically available random number generator sprng
545c6c1daeSBarry Smith 
555c6c1daeSBarry Smith    Options Database Keys:
561179163eSBarry Smith . -random_type <rand,rand48,sprng> - select the random number generator at runtime
575c6c1daeSBarry Smith 
581179163eSBarry Smith    Note:
591179163eSBarry Smith    PETSc must be ./configure with the option --download-sprng to use this random number generator.
605c6c1daeSBarry Smith 
611179163eSBarry Smith    Developer Note:
625c6c1daeSBarry Smith    This is NOT currently using a parallel random number generator. Sprng does have
635c6c1daeSBarry Smith    an MPI version we should investigate.
645c6c1daeSBarry Smith 
651179163eSBarry Smith   Level: beginner
661179163eSBarry Smith 
671179163eSBarry Smith .seealso: `RandomCreate()`, `RandomSetType()`, `PETSCRAND`, `PETSCRAND48`, `PetscRandomSetFromOptions()`
685c6c1daeSBarry Smith M*/
695c6c1daeSBarry Smith 
70d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom r)
71d71ae5a4SJacob Faibussowitsch {
725c6c1daeSBarry Smith   PetscFunctionBegin;
739566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(r->ops, &PetscRandomOps_Values, sizeof(PetscRandomOps_Values)));
749566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)r, PETSCSPRNG));
75*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
765c6c1daeSBarry Smith }
77