1*5c6c1daeSBarry Smith 2*5c6c1daeSBarry Smith #include <../src/sys/classes/random/randomimpl.h> 3*5c6c1daeSBarry Smith #if defined (PETSC_HAVE_STDLIB_H) 4*5c6c1daeSBarry Smith #include <stdlib.h> 5*5c6c1daeSBarry Smith #endif 6*5c6c1daeSBarry Smith 7*5c6c1daeSBarry Smith #undef __FUNCT__ 8*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomSeed_Rand" 9*5c6c1daeSBarry Smith PetscErrorCode PetscRandomSeed_Rand(PetscRandom r) 10*5c6c1daeSBarry Smith { 11*5c6c1daeSBarry Smith PetscFunctionBegin; 12*5c6c1daeSBarry Smith srand(r->seed); 13*5c6c1daeSBarry Smith PetscFunctionReturn(0); 14*5c6c1daeSBarry Smith } 15*5c6c1daeSBarry Smith 16*5c6c1daeSBarry Smith #define RAND_WRAP ((PetscReal)((rand()/(double)((unsigned int)RAND_MAX+1)))) 17*5c6c1daeSBarry Smith #undef __FUNCT__ 18*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomGetValue_Rand" 19*5c6c1daeSBarry Smith PetscErrorCode PetscRandomGetValue_Rand(PetscRandom r,PetscScalar *val) 20*5c6c1daeSBarry Smith { 21*5c6c1daeSBarry Smith PetscFunctionBegin; 22*5c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX) 23*5c6c1daeSBarry Smith if (r->iset) 24*5c6c1daeSBarry Smith *val = PetscRealPart(r->width)*RAND_WRAP + PetscRealPart(r->low) + 25*5c6c1daeSBarry Smith (PetscImaginaryPart(r->width)*RAND_WRAP + PetscImaginaryPart(r->low)) * PETSC_i; 26*5c6c1daeSBarry Smith else *val = RAND_WRAP + RAND_WRAP*PETSC_i; 27*5c6c1daeSBarry Smith #else 28*5c6c1daeSBarry Smith if (r->iset) *val = r->width * RAND_WRAP + r->low; 29*5c6c1daeSBarry Smith else *val = RAND_WRAP; 30*5c6c1daeSBarry Smith #endif 31*5c6c1daeSBarry Smith PetscFunctionReturn(0); 32*5c6c1daeSBarry Smith } 33*5c6c1daeSBarry Smith 34*5c6c1daeSBarry Smith #undef __FUNCT__ 35*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomGetValueReal_Rand" 36*5c6c1daeSBarry Smith PetscErrorCode PetscRandomGetValueReal_Rand(PetscRandom r,PetscReal *val) 37*5c6c1daeSBarry Smith { 38*5c6c1daeSBarry Smith PetscFunctionBegin; 39*5c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX) 40*5c6c1daeSBarry Smith if (r->iset) *val = PetscRealPart(r->width)*RAND_WRAP + PetscRealPart(r->low); 41*5c6c1daeSBarry Smith else *val = RAND_WRAP; 42*5c6c1daeSBarry Smith #else 43*5c6c1daeSBarry Smith if (r->iset) *val = r->width * RAND_WRAP + r->low; 44*5c6c1daeSBarry Smith else *val = RAND_WRAP; 45*5c6c1daeSBarry Smith #endif 46*5c6c1daeSBarry Smith PetscFunctionReturn(0); 47*5c6c1daeSBarry Smith } 48*5c6c1daeSBarry Smith 49*5c6c1daeSBarry Smith static struct _PetscRandomOps PetscRandomOps_Values = { 50*5c6c1daeSBarry Smith /* 0 */ 51*5c6c1daeSBarry Smith PetscRandomSeed_Rand, 52*5c6c1daeSBarry Smith PetscRandomGetValue_Rand, 53*5c6c1daeSBarry Smith PetscRandomGetValueReal_Rand, 54*5c6c1daeSBarry Smith 0, 55*5c6c1daeSBarry Smith /* 5 */ 56*5c6c1daeSBarry Smith 0 57*5c6c1daeSBarry Smith }; 58*5c6c1daeSBarry Smith 59*5c6c1daeSBarry Smith /*MC 60*5c6c1daeSBarry Smith PETSCRAND - access to the basic Unix random number generator 61*5c6c1daeSBarry Smith 62*5c6c1daeSBarry Smith Options Database Keys: 63*5c6c1daeSBarry Smith . -random_type <rand,rand48,sprng> 64*5c6c1daeSBarry Smith 65*5c6c1daeSBarry Smith Level: beginner 66*5c6c1daeSBarry Smith 67*5c6c1daeSBarry Smith .seealso: RandomCreate(), RandomSetType(), PETSCRAND48, PETSCSPRNG 68*5c6c1daeSBarry Smith M*/ 69*5c6c1daeSBarry Smith 70*5c6c1daeSBarry Smith EXTERN_C_BEGIN 71*5c6c1daeSBarry Smith #undef __FUNCT__ 72*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomCreate_Rand" 73*5c6c1daeSBarry Smith PetscErrorCode PetscRandomCreate_Rand(PetscRandom r) 74*5c6c1daeSBarry Smith { 75*5c6c1daeSBarry Smith PetscErrorCode ierr; 76*5c6c1daeSBarry Smith 77*5c6c1daeSBarry Smith PetscFunctionBegin; 78*5c6c1daeSBarry Smith ierr = PetscMemcpy(r->ops,&PetscRandomOps_Values,sizeof(PetscRandomOps_Values));CHKERRQ(ierr); 79*5c6c1daeSBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)r,PETSCRAND);CHKERRQ(ierr); 80*5c6c1daeSBarry Smith PetscFunctionReturn(0); 81*5c6c1daeSBarry Smith } 82*5c6c1daeSBarry Smith EXTERN_C_END 83