1 2 #include <petsc/private/randomimpl.h> 3 4 #define USE_MPI 5 #define SIMPLE_SPRNG 6 EXTERN_C_BEGIN 7 #include <sprng.h> 8 EXTERN_C_END 9 10 PetscErrorCode PetscRandomSeed_Sprng(PetscRandom r) { 11 PetscFunctionBegin; 12 init_sprng(r->seed, SPRNG_DEFAULT); 13 PetscFunctionReturn(0); 14 } 15 16 PetscErrorCode PetscRandomGetValue_Sprng(PetscRandom r, PetscScalar *val) { 17 PetscFunctionBegin; 18 #if defined(PETSC_USE_COMPLEX) 19 if (r->iset) { 20 *val = PetscRealPart(r->width) * sprng() + PetscRealPart(r->low) + (PetscImaginaryPart(r->width) * sprng() + PetscImaginaryPart(r->low)) * PETSC_i; 21 } else { 22 *val = sprng() + sprng() * PETSC_i; 23 } 24 #else 25 if (r->iset) *val = r->width * sprng() + r->low; 26 else *val = sprng(); 27 #endif 28 PetscFunctionReturn(0); 29 } 30 31 PetscErrorCode PetscRandomGetValueReal_Sprng(PetscRandom r, PetscReal *val) { 32 PetscFunctionBegin; 33 #if defined(PETSC_USE_COMPLEX) 34 if (r->iset) *val = PetscRealPart(r->width) * sprng() + PetscRealPart(r->low); 35 else *val = sprng(); 36 #else 37 if (r->iset) *val = r->width * sprng() + r->low; 38 else *val = sprng(); 39 #endif 40 PetscFunctionReturn(0); 41 } 42 43 static struct _PetscRandomOps PetscRandomOps_Values = { 44 PetscDesignatedInitializer(seed, PetscRandomSeed_Sprng), 45 PetscDesignatedInitializer(getvalue, PetscRandomGetValue_Sprng), 46 PetscDesignatedInitializer(getvaluereal, PetscRandomGetValueReal_Sprng), 47 }; 48 49 /*MC 50 PETSCSPRNG - access to the publically available random number generator sprng 51 52 Options Database Keys: 53 . -random_type <rand,rand48,sprng> - select the random number generator at runtime 54 55 Note: 56 PETSc must be ./configure with the option --download-sprng to use this random number generator. 57 58 Developer Note: 59 This is NOT currently using a parallel random number generator. Sprng does have 60 an MPI version we should investigate. 61 62 Level: beginner 63 64 .seealso: `RandomCreate()`, `RandomSetType()`, `PETSCRAND`, `PETSCRAND48`, `PetscRandomSetFromOptions()` 65 M*/ 66 67 PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom r) { 68 PetscFunctionBegin; 69 PetscCall(PetscMemcpy(r->ops, &PetscRandomOps_Values, sizeof(PetscRandomOps_Values))); 70 PetscCall(PetscObjectChangeTypeName((PetscObject)r, PETSCSPRNG)); 71 PetscFunctionReturn(0); 72 } 73