10039db0dSBarry Smith #define PETSC_DESIRE_FEATURE_TEST_MACROS /* for drand48() */ 2d6cc7855SJacob Faibussowitsch #include <petsc/private/randomimpl.h> 35c6c1daeSBarry Smith 49371c9d4SSatish Balay PetscErrorCode PetscRandomSeed_Rand48(PetscRandom r) { 55c6c1daeSBarry Smith PetscFunctionBegin; 65c6c1daeSBarry Smith srand48(r->seed); 75c6c1daeSBarry Smith PetscFunctionReturn(0); 85c6c1daeSBarry Smith } 95c6c1daeSBarry Smith 109371c9d4SSatish Balay PetscErrorCode PetscRandomGetValue_Rand48(PetscRandom r, PetscScalar *val) { 115c6c1daeSBarry Smith PetscFunctionBegin; 125c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX) 135c6c1daeSBarry Smith if (r->iset) { 14b0043f70SBarry Smith *val = PetscRealPart(r->width) * (PetscReal)drand48() + PetscRealPart(r->low) + (PetscImaginaryPart(r->width) * (PetscReal)drand48() + PetscImaginaryPart(r->low)) * PETSC_i; 155c6c1daeSBarry Smith } else { 165c6c1daeSBarry Smith *val = (PetscReal)drand48() + (PetscReal)drand48() * PETSC_i; 175c6c1daeSBarry Smith } 185c6c1daeSBarry Smith #else 195c6c1daeSBarry Smith if (r->iset) *val = r->width * drand48() + r->low; 205c6c1daeSBarry Smith else *val = drand48(); 215c6c1daeSBarry Smith #endif 225c6c1daeSBarry Smith PetscFunctionReturn(0); 235c6c1daeSBarry Smith } 245c6c1daeSBarry Smith 259371c9d4SSatish Balay PetscErrorCode PetscRandomGetValueReal_Rand48(PetscRandom r, PetscReal *val) { 265c6c1daeSBarry Smith PetscFunctionBegin; 275c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX) 285c6c1daeSBarry Smith if (r->iset) *val = PetscRealPart(r->width) * drand48() + PetscRealPart(r->low); 295c6c1daeSBarry Smith else *val = drand48(); 305c6c1daeSBarry Smith #else 315c6c1daeSBarry Smith if (r->iset) *val = r->width * drand48() + r->low; 325c6c1daeSBarry Smith else *val = drand48(); 335c6c1daeSBarry Smith #endif 345c6c1daeSBarry Smith PetscFunctionReturn(0); 355c6c1daeSBarry Smith } 365c6c1daeSBarry Smith 375c6c1daeSBarry Smith static struct _PetscRandomOps PetscRandomOps_Values = { 38267267bdSJacob Faibussowitsch PetscDesignatedInitializer(seed, PetscRandomSeed_Rand48), 39267267bdSJacob Faibussowitsch PetscDesignatedInitializer(getvalue, PetscRandomGetValue_Rand48), 40267267bdSJacob Faibussowitsch PetscDesignatedInitializer(getvaluereal, PetscRandomGetValueReal_Rand48), 415c6c1daeSBarry Smith }; 425c6c1daeSBarry Smith 435c6c1daeSBarry Smith /*MC 445c6c1daeSBarry Smith PETSCRAND48 - access to the basic Unix drand48() random number generator 455c6c1daeSBarry Smith 465c6c1daeSBarry Smith Options Database Keys: 471179163eSBarry Smith . -random_type <rand,rand48,sprng> - select the random number generator at runtime 485c6c1daeSBarry Smith 495c6c1daeSBarry Smith Level: beginner 505c6c1daeSBarry Smith 51*811af0c4SBarry Smith Note: 521179163eSBarry Smith Not recommended because it may produce different results on different systems. 531179163eSBarry Smith 541179163eSBarry Smith .seealso: `PetscRandomCreate()`, `PetscRandomSetType()`, `PETSCRAND`, `PETSCSPRNG`, `PetscRandomSetFromOptions()` 555c6c1daeSBarry Smith M*/ 565c6c1daeSBarry Smith 579371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand48(PetscRandom r) { 585c6c1daeSBarry Smith PetscFunctionBegin; 599566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(r->ops, &PetscRandomOps_Values, sizeof(PetscRandomOps_Values))); 609566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)r, PETSCRAND48)); 615c6c1daeSBarry Smith PetscFunctionReturn(0); 625c6c1daeSBarry Smith } 63