15c6c1daeSBarry Smith 2d6cc7855SJacob Faibussowitsch #include <petsc/private/randomimpl.h> 35c6c1daeSBarry Smith 45c6c1daeSBarry Smith PetscErrorCode PetscRandomSeed_Rand(PetscRandom r) 55c6c1daeSBarry Smith { 65c6c1daeSBarry Smith PetscFunctionBegin; 75c6c1daeSBarry Smith srand(r->seed); 85c6c1daeSBarry Smith PetscFunctionReturn(0); 95c6c1daeSBarry Smith } 105c6c1daeSBarry Smith 115c6c1daeSBarry Smith #define RAND_WRAP ((PetscReal)((rand()/(double)((unsigned int)RAND_MAX+1)))) 125c6c1daeSBarry Smith PetscErrorCode PetscRandomGetValue_Rand(PetscRandom r,PetscScalar *val) 135c6c1daeSBarry Smith { 145c6c1daeSBarry Smith PetscFunctionBegin; 155c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX) 16b0043f70SBarry Smith if (r->iset) *val = PetscRealPart(r->width)*RAND_WRAP + PetscRealPart(r->low) + (PetscImaginaryPart(r->width)*RAND_WRAP + PetscImaginaryPart(r->low)) * PETSC_i; 175c6c1daeSBarry Smith else *val = RAND_WRAP + RAND_WRAP*PETSC_i; 185c6c1daeSBarry Smith #else 195c6c1daeSBarry Smith if (r->iset) *val = r->width * RAND_WRAP + r->low; 205c6c1daeSBarry Smith else *val = RAND_WRAP; 215c6c1daeSBarry Smith #endif 225c6c1daeSBarry Smith PetscFunctionReturn(0); 235c6c1daeSBarry Smith } 245c6c1daeSBarry Smith 255c6c1daeSBarry Smith PetscErrorCode PetscRandomGetValueReal_Rand(PetscRandom r,PetscReal *val) 265c6c1daeSBarry Smith { 275c6c1daeSBarry Smith PetscFunctionBegin; 285c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX) 295c6c1daeSBarry Smith if (r->iset) *val = PetscRealPart(r->width)*RAND_WRAP + PetscRealPart(r->low); 305c6c1daeSBarry Smith else *val = RAND_WRAP; 315c6c1daeSBarry Smith #else 325c6c1daeSBarry Smith if (r->iset) *val = r->width * RAND_WRAP + r->low; 335c6c1daeSBarry Smith else *val = RAND_WRAP; 345c6c1daeSBarry Smith #endif 355c6c1daeSBarry Smith PetscFunctionReturn(0); 365c6c1daeSBarry Smith } 375c6c1daeSBarry Smith 385c6c1daeSBarry Smith static struct _PetscRandomOps PetscRandomOps_Values = { 39*267267bdSJacob Faibussowitsch PetscDesignatedInitializer(seed,PetscRandomSeed_Rand), 40*267267bdSJacob Faibussowitsch PetscDesignatedInitializer(getvalue,PetscRandomGetValue_Rand), 41*267267bdSJacob Faibussowitsch PetscDesignatedInitializer(getvaluereal,PetscRandomGetValueReal_Rand), 425c6c1daeSBarry Smith }; 435c6c1daeSBarry Smith 445c6c1daeSBarry Smith /*MC 455c6c1daeSBarry Smith PETSCRAND - access to the basic Unix random number generator 465c6c1daeSBarry Smith 475c6c1daeSBarry Smith Options Database Keys: 485c6c1daeSBarry Smith . -random_type <rand,rand48,sprng> 495c6c1daeSBarry Smith 505c6c1daeSBarry Smith Level: beginner 515c6c1daeSBarry Smith 52808ba619SStefano Zampini .seealso: PetscRandomCreate(), PetscRandomSetType(), PETSCRAND48, PETSCSPRNG 535c6c1daeSBarry Smith M*/ 545c6c1daeSBarry Smith 558cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom r) 565c6c1daeSBarry Smith { 575c6c1daeSBarry Smith PetscErrorCode ierr; 585c6c1daeSBarry Smith 595c6c1daeSBarry Smith PetscFunctionBegin; 605c6c1daeSBarry Smith ierr = PetscMemcpy(r->ops,&PetscRandomOps_Values,sizeof(PetscRandomOps_Values));CHKERRQ(ierr); 615c6c1daeSBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)r,PETSCRAND);CHKERRQ(ierr); 625c6c1daeSBarry Smith PetscFunctionReturn(0); 635c6c1daeSBarry Smith } 64