1 #include <petsc/private/randomimpl.h> 2 3 static PetscErrorCode PetscRandomSeed_Rand(PetscRandom r) 4 { 5 PetscFunctionBegin; 6 srand((unsigned int)r->seed); 7 PetscFunctionReturn(PETSC_SUCCESS); 8 } 9 10 #define RAND_WRAP ((PetscReal)(rand() / (double)((unsigned int)RAND_MAX + 1))) 11 static PetscErrorCode PetscRandomGetValue_Rand(PetscRandom r, PetscScalar *val) 12 { 13 PetscFunctionBegin; 14 #if defined(PETSC_USE_COMPLEX) 15 if (r->iset) *val = PetscRealPart(r->width) * RAND_WRAP + PetscRealPart(r->low) + (PetscImaginaryPart(r->width) * RAND_WRAP + PetscImaginaryPart(r->low)) * PETSC_i; 16 else *val = RAND_WRAP + RAND_WRAP * PETSC_i; 17 #else 18 if (r->iset) *val = r->width * RAND_WRAP + r->low; 19 else *val = RAND_WRAP; 20 #endif 21 PetscFunctionReturn(PETSC_SUCCESS); 22 } 23 24 static PetscErrorCode PetscRandomGetValueReal_Rand(PetscRandom r, PetscReal *val) 25 { 26 PetscFunctionBegin; 27 #if defined(PETSC_USE_COMPLEX) 28 if (r->iset) *val = PetscRealPart(r->width) * RAND_WRAP + PetscRealPart(r->low); 29 else *val = RAND_WRAP; 30 #else 31 if (r->iset) *val = r->width * RAND_WRAP + r->low; 32 else *val = RAND_WRAP; 33 #endif 34 PetscFunctionReturn(PETSC_SUCCESS); 35 } 36 37 static struct _PetscRandomOps PetscRandomOps_Values = { 38 PetscDesignatedInitializer(seed, PetscRandomSeed_Rand), 39 PetscDesignatedInitializer(getvalue, PetscRandomGetValue_Rand), 40 PetscDesignatedInitializer(getvaluereal, PetscRandomGetValueReal_Rand), 41 PetscDesignatedInitializer(getvalues, NULL), 42 PetscDesignatedInitializer(getvaluesreal, NULL), 43 PetscDesignatedInitializer(destroy, NULL), 44 PetscDesignatedInitializer(setfromoptions, NULL), 45 }; 46 47 /*MC 48 PETSCRAND - access to the basic Unix random number generator 49 50 Options Database Key: 51 . -random_type <rand,rand48,sprng> - set the random number generator from the options database 52 53 Level: beginner 54 55 Note: 56 Not recommended since it can produce different numbers on different systems 57 58 .seealso: `PetscRandomCreate()`, `PetscRandomSetType()`, `PETSCRAND48`, `PETSCSPRNG`, `PetscRandomSetFromOptions()`, `PetscRandomType` 59 M*/ 60 61 PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom r) 62 { 63 PetscFunctionBegin; 64 r->ops[0] = PetscRandomOps_Values; 65 PetscCall(PetscObjectChangeTypeName((PetscObject)r, PETSCRAND)); 66 PetscFunctionReturn(PETSC_SUCCESS); 67 } 68