1*5c6c1daeSBarry Smith 2*5c6c1daeSBarry Smith #include <../src/sys/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 #define USE_MPI 8*5c6c1daeSBarry Smith #define SIMPLE_SPRNG 9*5c6c1daeSBarry Smith EXTERN_C_BEGIN 10*5c6c1daeSBarry Smith #include <sprng.h> 11*5c6c1daeSBarry Smith EXTERN_C_END 12*5c6c1daeSBarry Smith 13*5c6c1daeSBarry Smith #undef __FUNCT__ 14*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomSeed_Sprng" 15*5c6c1daeSBarry Smith PetscErrorCode PetscRandomSeed_Sprng(PetscRandom r) 16*5c6c1daeSBarry Smith { 17*5c6c1daeSBarry Smith PetscFunctionBegin; 18*5c6c1daeSBarry Smith init_sprng(r->seed,SPRNG_DEFAULT); 19*5c6c1daeSBarry Smith PetscFunctionReturn(0); 20*5c6c1daeSBarry Smith } 21*5c6c1daeSBarry Smith 22*5c6c1daeSBarry Smith #undef __FUNCT__ 23*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomGetValue_Sprng" 24*5c6c1daeSBarry Smith PetscErrorCode PetscRandomGetValue_Sprng(PetscRandom r,PetscScalar *val) 25*5c6c1daeSBarry Smith { 26*5c6c1daeSBarry Smith PetscFunctionBegin; 27*5c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX) 28*5c6c1daeSBarry Smith if (r->iset) { 29*5c6c1daeSBarry Smith *val = PetscRealPart(r->width)*sprng() + PetscRealPart(r->low) + 30*5c6c1daeSBarry Smith (PetscImaginaryPart(r->width)*sprng() + PetscImaginaryPart(r->low)) * PETSC_i; 31*5c6c1daeSBarry Smith } else { 32*5c6c1daeSBarry Smith *val = sprng() + sprng()*PETSC_i; 33*5c6c1daeSBarry Smith } 34*5c6c1daeSBarry Smith #else 35*5c6c1daeSBarry Smith if (r->iset) *val = r->width * sprng() + r->low; 36*5c6c1daeSBarry Smith else *val = sprng(); 37*5c6c1daeSBarry Smith #endif 38*5c6c1daeSBarry Smith PetscFunctionReturn(0); 39*5c6c1daeSBarry Smith } 40*5c6c1daeSBarry Smith 41*5c6c1daeSBarry Smith #undef __FUNCT__ 42*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomGetValue_Sprng" 43*5c6c1daeSBarry Smith PetscErrorCode PetscRandomGetValueReal_Sprng(PetscRandom r,PetscScalar *val) 44*5c6c1daeSBarry Smith { 45*5c6c1daeSBarry Smith PetscFunctionBegin; 46*5c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX) 47*5c6c1daeSBarry Smith if (r->iset) *val = PetscRealPart(r->width)*sprng() + PetscRealPart(r->low); 48*5c6c1daeSBarry Smith else *val = sprng(); 49*5c6c1daeSBarry Smith #else 50*5c6c1daeSBarry Smith if (r->iset) *val = r->width * sprng() + r->low; 51*5c6c1daeSBarry Smith else *val = sprng(); 52*5c6c1daeSBarry Smith #endif 53*5c6c1daeSBarry Smith PetscFunctionReturn(0); 54*5c6c1daeSBarry Smith } 55*5c6c1daeSBarry Smith 56*5c6c1daeSBarry Smith static struct _PetscRandomOps PetscRandomOps_Values = { 57*5c6c1daeSBarry Smith /* 0 */ 58*5c6c1daeSBarry Smith PetscRandomSeed_Sprng, 59*5c6c1daeSBarry Smith PetscRandomGetValue_Sprng, 60*5c6c1daeSBarry Smith PetscRandomGetValueReal_Sprng, 61*5c6c1daeSBarry Smith 0, 62*5c6c1daeSBarry Smith /* 5 */ 63*5c6c1daeSBarry Smith 0 64*5c6c1daeSBarry Smith }; 65*5c6c1daeSBarry Smith 66*5c6c1daeSBarry Smith /*MC 67*5c6c1daeSBarry Smith PETSCSPRNG- access to the publically available random number generator sprng 68*5c6c1daeSBarry Smith 69*5c6c1daeSBarry Smith Options Database Keys: 70*5c6c1daeSBarry Smith . -random_type <rand,rand48,sprng> 71*5c6c1daeSBarry Smith 72*5c6c1daeSBarry Smith Level: beginner 73*5c6c1daeSBarry Smith 74*5c6c1daeSBarry Smith PETSc must have been ./configure with the option --download-sprng to use 75*5c6c1daeSBarry Smith this random number generator. 76*5c6c1daeSBarry Smith 77*5c6c1daeSBarry Smith This is NOT currently using a parallel random number generator. Sprng does have 78*5c6c1daeSBarry Smith an MPI version we should investigate. 79*5c6c1daeSBarry Smith 80*5c6c1daeSBarry Smith .seealso: RandomCreate(), RandomSetType(), PETSCRAND, PETSCRAND48 81*5c6c1daeSBarry Smith M*/ 82*5c6c1daeSBarry Smith 83*5c6c1daeSBarry Smith EXTERN_C_BEGIN 84*5c6c1daeSBarry Smith #undef __FUNCT__ 85*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomCreate_Sprng" 86*5c6c1daeSBarry Smith PetscErrorCode PetscRandomCreate_Sprng(PetscRandom r) 87*5c6c1daeSBarry Smith { 88*5c6c1daeSBarry Smith PetscErrorCode ierr; 89*5c6c1daeSBarry Smith 90*5c6c1daeSBarry Smith PetscFunctionBegin; 91*5c6c1daeSBarry Smith ierr = PetscMemcpy(r->ops,&PetscRandomOps_Values,sizeof(PetscRandomOps_Values));CHKERRQ(ierr); 92*5c6c1daeSBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)r,PETSCSPRNG);CHKERRQ(ierr); 93*5c6c1daeSBarry Smith PetscFunctionReturn(0); 94*5c6c1daeSBarry Smith } 95*5c6c1daeSBarry Smith EXTERN_C_END 96