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