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 10*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomSeed_Sprng(PetscRandom r) 11*d71ae5a4SJacob Faibussowitsch { 125c6c1daeSBarry Smith PetscFunctionBegin; 135c6c1daeSBarry Smith init_sprng(r->seed, SPRNG_DEFAULT); 145c6c1daeSBarry Smith PetscFunctionReturn(0); 155c6c1daeSBarry Smith } 165c6c1daeSBarry Smith 17*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomGetValue_Sprng(PetscRandom r, PetscScalar *val) 18*d71ae5a4SJacob 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 305c6c1daeSBarry Smith PetscFunctionReturn(0); 315c6c1daeSBarry Smith } 325c6c1daeSBarry Smith 33*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomGetValueReal_Sprng(PetscRandom r, PetscReal *val) 34*d71ae5a4SJacob 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 435c6c1daeSBarry Smith PetscFunctionReturn(0); 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 70*d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom r) 71*d71ae5a4SJacob Faibussowitsch { 725c6c1daeSBarry Smith PetscFunctionBegin; 739566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(r->ops, &PetscRandomOps_Values, sizeof(PetscRandomOps_Values))); 749566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)r, PETSCSPRNG)); 755c6c1daeSBarry Smith PetscFunctionReturn(0); 765c6c1daeSBarry Smith } 77