1d6cc7855SJacob Faibussowitsch #include <petsc/private/randomimpl.h>
25c6c1daeSBarry Smith
35c6c1daeSBarry Smith #define USE_MPI
45c6c1daeSBarry Smith #define SIMPLE_SPRNG
55c6c1daeSBarry Smith EXTERN_C_BEGIN
65c6c1daeSBarry Smith #include <sprng.h>
75c6c1daeSBarry Smith EXTERN_C_END
85c6c1daeSBarry Smith
PetscRandomSeed_Sprng(PetscRandom r)966976f2fSJacob Faibussowitsch static PetscErrorCode PetscRandomSeed_Sprng(PetscRandom r)
10d71ae5a4SJacob Faibussowitsch {
115c6c1daeSBarry Smith PetscFunctionBegin;
125c6c1daeSBarry Smith init_sprng(r->seed, SPRNG_DEFAULT);
133ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
145c6c1daeSBarry Smith }
155c6c1daeSBarry Smith
PetscRandomGetValue_Sprng(PetscRandom r,PetscScalar * val)1666976f2fSJacob Faibussowitsch static PetscErrorCode PetscRandomGetValue_Sprng(PetscRandom r, PetscScalar *val)
17d71ae5a4SJacob Faibussowitsch {
185c6c1daeSBarry Smith PetscFunctionBegin;
195c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
205c6c1daeSBarry Smith if (r->iset) {
21b0043f70SBarry Smith *val = PetscRealPart(r->width) * sprng() + PetscRealPart(r->low) + (PetscImaginaryPart(r->width) * sprng() + PetscImaginaryPart(r->low)) * PETSC_i;
225c6c1daeSBarry Smith } else {
235c6c1daeSBarry Smith *val = sprng() + sprng() * PETSC_i;
245c6c1daeSBarry Smith }
255c6c1daeSBarry Smith #else
265c6c1daeSBarry Smith if (r->iset) *val = r->width * sprng() + r->low;
275c6c1daeSBarry Smith else *val = sprng();
285c6c1daeSBarry Smith #endif
293ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
305c6c1daeSBarry Smith }
315c6c1daeSBarry Smith
PetscRandomGetValueReal_Sprng(PetscRandom r,PetscReal * val)3266976f2fSJacob Faibussowitsch static PetscErrorCode PetscRandomGetValueReal_Sprng(PetscRandom r, PetscReal *val)
33d71ae5a4SJacob Faibussowitsch {
345c6c1daeSBarry Smith PetscFunctionBegin;
355c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
365c6c1daeSBarry Smith if (r->iset) *val = PetscRealPart(r->width) * sprng() + PetscRealPart(r->low);
375c6c1daeSBarry Smith else *val = sprng();
385c6c1daeSBarry Smith #else
395c6c1daeSBarry Smith if (r->iset) *val = r->width * sprng() + r->low;
405c6c1daeSBarry Smith else *val = sprng();
415c6c1daeSBarry Smith #endif
423ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
435c6c1daeSBarry Smith }
445c6c1daeSBarry Smith
455c6c1daeSBarry Smith static struct _PetscRandomOps PetscRandomOps_Values = {
46267267bdSJacob Faibussowitsch PetscDesignatedInitializer(seed, PetscRandomSeed_Sprng),
47267267bdSJacob Faibussowitsch PetscDesignatedInitializer(getvalue, PetscRandomGetValue_Sprng),
48267267bdSJacob Faibussowitsch PetscDesignatedInitializer(getvaluereal, PetscRandomGetValueReal_Sprng),
495c6c1daeSBarry Smith };
505c6c1daeSBarry Smith
515c6c1daeSBarry Smith /*MC
52da81f932SPierre Jolivet PETSCSPRNG - access to the publicly available random number generator sprng
535c6c1daeSBarry Smith
54*c31d2375SBarry Smith Options Database Key:
551179163eSBarry Smith . -random_type <rand,rand48,sprng> - select the random number generator at runtime
565c6c1daeSBarry Smith
57*c31d2375SBarry Smith Level: beginner
58*c31d2375SBarry Smith
591179163eSBarry Smith Note:
601179163eSBarry Smith PETSc must be ./configure with the option --download-sprng to use this random number generator.
615c6c1daeSBarry Smith
621179163eSBarry Smith Developer Note:
635c6c1daeSBarry Smith This is NOT currently using a parallel random number generator. Sprng does have
645c6c1daeSBarry Smith an MPI version we should investigate.
655c6c1daeSBarry Smith
661179163eSBarry Smith .seealso: `RandomCreate()`, `RandomSetType()`, `PETSCRAND`, `PETSCRAND48`, `PetscRandomSetFromOptions()`
675c6c1daeSBarry Smith M*/
685c6c1daeSBarry Smith
PetscRandomCreate_Sprng(PetscRandom r)69d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom r)
70d71ae5a4SJacob Faibussowitsch {
715c6c1daeSBarry Smith PetscFunctionBegin;
722ad7e442SBarry Smith r->ops[0] = PetscRandomOps_Values;
739566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)r, PETSCSPRNG));
743ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
755c6c1daeSBarry Smith }
76