1d6cc7855SJacob Faibussowitsch #include <petsc/private/randomimpl.h> 25c6c1daeSBarry Smith 366976f2fSJacob Faibussowitsch static PetscErrorCode PetscRandomSeed_Rand(PetscRandom r) 4d71ae5a4SJacob Faibussowitsch { 55c6c1daeSBarry Smith PetscFunctionBegin; 66497c311SBarry Smith srand((unsigned int)r->seed); 73ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 85c6c1daeSBarry Smith } 95c6c1daeSBarry Smith 10f4f49eeaSPierre Jolivet #define RAND_WRAP ((PetscReal)(rand() / (double)((unsigned int)RAND_MAX + 1))) 1166976f2fSJacob Faibussowitsch static PetscErrorCode PetscRandomGetValue_Rand(PetscRandom r, PetscScalar *val) 12d71ae5a4SJacob Faibussowitsch { 135c6c1daeSBarry Smith PetscFunctionBegin; 145c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX) 15b0043f70SBarry Smith if (r->iset) *val = PetscRealPart(r->width) * RAND_WRAP + PetscRealPart(r->low) + (PetscImaginaryPart(r->width) * RAND_WRAP + PetscImaginaryPart(r->low)) * PETSC_i; 165c6c1daeSBarry Smith else *val = RAND_WRAP + RAND_WRAP * PETSC_i; 175c6c1daeSBarry Smith #else 185c6c1daeSBarry Smith if (r->iset) *val = r->width * RAND_WRAP + r->low; 195c6c1daeSBarry Smith else *val = RAND_WRAP; 205c6c1daeSBarry Smith #endif 213ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 225c6c1daeSBarry Smith } 235c6c1daeSBarry Smith 2466976f2fSJacob Faibussowitsch static PetscErrorCode PetscRandomGetValueReal_Rand(PetscRandom r, PetscReal *val) 25d71ae5a4SJacob Faibussowitsch { 265c6c1daeSBarry Smith PetscFunctionBegin; 275c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX) 285c6c1daeSBarry Smith if (r->iset) *val = PetscRealPart(r->width) * RAND_WRAP + PetscRealPart(r->low); 295c6c1daeSBarry Smith else *val = RAND_WRAP; 305c6c1daeSBarry Smith #else 315c6c1daeSBarry Smith if (r->iset) *val = r->width * RAND_WRAP + r->low; 325c6c1daeSBarry Smith else *val = RAND_WRAP; 335c6c1daeSBarry Smith #endif 343ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 355c6c1daeSBarry Smith } 365c6c1daeSBarry Smith 375c6c1daeSBarry Smith static struct _PetscRandomOps PetscRandomOps_Values = { 38267267bdSJacob Faibussowitsch PetscDesignatedInitializer(seed, PetscRandomSeed_Rand), 39267267bdSJacob Faibussowitsch PetscDesignatedInitializer(getvalue, PetscRandomGetValue_Rand), 40267267bdSJacob Faibussowitsch PetscDesignatedInitializer(getvaluereal, PetscRandomGetValueReal_Rand), 41*8a403008SStefano Zampini PetscDesignatedInitializer(getvalues, NULL), 42*8a403008SStefano Zampini PetscDesignatedInitializer(getvaluesreal, NULL), 43*8a403008SStefano Zampini PetscDesignatedInitializer(destroy, NULL), 44*8a403008SStefano Zampini PetscDesignatedInitializer(setfromoptions, NULL), 455c6c1daeSBarry Smith }; 465c6c1daeSBarry Smith 475c6c1daeSBarry Smith /*MC 485c6c1daeSBarry Smith PETSCRAND - access to the basic Unix random number generator 495c6c1daeSBarry Smith 50c31d2375SBarry Smith Options Database Key: 511179163eSBarry Smith . -random_type <rand,rand48,sprng> - set the random number generator from the options database 525c6c1daeSBarry Smith 535c6c1daeSBarry Smith Level: beginner 545c6c1daeSBarry Smith 55811af0c4SBarry Smith Note: 56811af0c4SBarry Smith Not recommended since it can produce different numbers on different systems 57811af0c4SBarry Smith 58811af0c4SBarry Smith .seealso: `PetscRandomCreate()`, `PetscRandomSetType()`, `PETSCRAND48`, `PETSCSPRNG`, `PetscRandomSetFromOptions()`, `PetscRandomType` 595c6c1daeSBarry Smith M*/ 605c6c1daeSBarry Smith 61d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom r) 62d71ae5a4SJacob Faibussowitsch { 635c6c1daeSBarry Smith PetscFunctionBegin; 64aea10558SJacob Faibussowitsch r->ops[0] = PetscRandomOps_Values; 659566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)r, PETSCRAND)); 663ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 675c6c1daeSBarry Smith } 68