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