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 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 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 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 545c6c1daeSBarry Smith Options Database Keys: 551179163eSBarry Smith . -random_type <rand,rand48,sprng> - select the random number generator at runtime 565c6c1daeSBarry Smith 571179163eSBarry Smith Note: 581179163eSBarry Smith PETSc must be ./configure with the option --download-sprng to use this random number generator. 595c6c1daeSBarry Smith 601179163eSBarry Smith Developer Note: 615c6c1daeSBarry Smith This is NOT currently using a parallel random number generator. Sprng does have 625c6c1daeSBarry Smith an MPI version we should investigate. 635c6c1daeSBarry Smith 641179163eSBarry Smith Level: beginner 651179163eSBarry Smith 661179163eSBarry Smith .seealso: `RandomCreate()`, `RandomSetType()`, `PETSCRAND`, `PETSCRAND48`, `PetscRandomSetFromOptions()` 675c6c1daeSBarry Smith M*/ 685c6c1daeSBarry Smith 69d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom r) 70d71ae5a4SJacob Faibussowitsch { 715c6c1daeSBarry Smith PetscFunctionBegin; 72*2ad7e442SBarry Smith r->ops[0] = PetscRandomOps_Values; 739566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)r, PETSCSPRNG)); 743ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 755c6c1daeSBarry Smith } 76