15c6c1daeSBarry Smith 2d6cc7855SJacob Faibussowitsch #include <petsc/private/randomimpl.h> 35c6c1daeSBarry Smith 49371c9d4SSatish Balay PetscErrorCode PetscRandomSeed_Rand(PetscRandom r) { 55c6c1daeSBarry Smith PetscFunctionBegin; 65c6c1daeSBarry Smith srand(r->seed); 75c6c1daeSBarry Smith PetscFunctionReturn(0); 85c6c1daeSBarry Smith } 95c6c1daeSBarry Smith 105c6c1daeSBarry Smith #define RAND_WRAP ((PetscReal)((rand() / (double)((unsigned int)RAND_MAX + 1)))) 119371c9d4SSatish Balay PetscErrorCode PetscRandomGetValue_Rand(PetscRandom r, PetscScalar *val) { 125c6c1daeSBarry Smith PetscFunctionBegin; 135c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX) 14b0043f70SBarry Smith if (r->iset) *val = PetscRealPart(r->width) * RAND_WRAP + PetscRealPart(r->low) + (PetscImaginaryPart(r->width) * RAND_WRAP + PetscImaginaryPart(r->low)) * PETSC_i; 155c6c1daeSBarry Smith else *val = RAND_WRAP + RAND_WRAP * PETSC_i; 165c6c1daeSBarry Smith #else 175c6c1daeSBarry Smith if (r->iset) *val = r->width * RAND_WRAP + r->low; 185c6c1daeSBarry Smith else *val = RAND_WRAP; 195c6c1daeSBarry Smith #endif 205c6c1daeSBarry Smith PetscFunctionReturn(0); 215c6c1daeSBarry Smith } 225c6c1daeSBarry Smith 239371c9d4SSatish Balay PetscErrorCode PetscRandomGetValueReal_Rand(PetscRandom r, PetscReal *val) { 245c6c1daeSBarry Smith PetscFunctionBegin; 255c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX) 265c6c1daeSBarry Smith if (r->iset) *val = PetscRealPart(r->width) * RAND_WRAP + PetscRealPart(r->low); 275c6c1daeSBarry Smith else *val = RAND_WRAP; 285c6c1daeSBarry Smith #else 295c6c1daeSBarry Smith if (r->iset) *val = r->width * RAND_WRAP + r->low; 305c6c1daeSBarry Smith else *val = RAND_WRAP; 315c6c1daeSBarry Smith #endif 325c6c1daeSBarry Smith PetscFunctionReturn(0); 335c6c1daeSBarry Smith } 345c6c1daeSBarry Smith 355c6c1daeSBarry Smith static struct _PetscRandomOps PetscRandomOps_Values = { 36267267bdSJacob Faibussowitsch PetscDesignatedInitializer(seed, PetscRandomSeed_Rand), 37267267bdSJacob Faibussowitsch PetscDesignatedInitializer(getvalue, PetscRandomGetValue_Rand), 38267267bdSJacob Faibussowitsch PetscDesignatedInitializer(getvaluereal, PetscRandomGetValueReal_Rand), 395c6c1daeSBarry Smith }; 405c6c1daeSBarry Smith 415c6c1daeSBarry Smith /*MC 425c6c1daeSBarry Smith PETSCRAND - access to the basic Unix random number generator 435c6c1daeSBarry Smith 445c6c1daeSBarry Smith Options Database Keys: 451179163eSBarry Smith . -random_type <rand,rand48,sprng> - set the random number generator from the options database 465c6c1daeSBarry Smith 475c6c1daeSBarry Smith Level: beginner 485c6c1daeSBarry Smith 49*811af0c4SBarry Smith Note: 50*811af0c4SBarry Smith Not recommended since it can produce different numbers on different systems 51*811af0c4SBarry Smith 52*811af0c4SBarry Smith .seealso: `PetscRandomCreate()`, `PetscRandomSetType()`, `PETSCRAND48`, `PETSCSPRNG`, `PetscRandomSetFromOptions()`, `PetscRandomType` 535c6c1daeSBarry Smith M*/ 545c6c1daeSBarry Smith 559371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom r) { 565c6c1daeSBarry Smith PetscFunctionBegin; 579566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(r->ops, &PetscRandomOps_Values, sizeof(PetscRandomOps_Values))); 589566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)r, PETSCRAND)); 595c6c1daeSBarry Smith PetscFunctionReturn(0); 605c6c1daeSBarry Smith } 61