Actual source code: sprng.c


  2: #include <../src/sys/classes/random/randomimpl.h>

  4: #define USE_MPI
  5: #define SIMPLE_SPRNG
  6: EXTERN_C_BEGIN
  7: #include <sprng.h>
  8: EXTERN_C_END

 10: PetscErrorCode  PetscRandomSeed_Sprng(PetscRandom r)
 11: {
 13:   init_sprng(r->seed,SPRNG_DEFAULT);
 14:   return(0);
 15: }

 17: PetscErrorCode  PetscRandomGetValue_Sprng(PetscRandom r,PetscScalar *val)
 18: {
 20: #if defined(PETSC_USE_COMPLEX)
 21:   if (r->iset) {
 22:     *val = PetscRealPart(r->width)*sprng() + PetscRealPart(r->low) + (PetscImaginaryPart(r->width)*sprng() + PetscImaginaryPart(r->low)) * PETSC_i;
 23:   } else {
 24:     *val = sprng() + sprng()*PETSC_i;
 25:   }
 26: #else
 27:   if (r->iset) *val = r->width * sprng() + r->low;
 28:   else         *val = sprng();
 29: #endif
 30:   return(0);
 31: }

 33: PetscErrorCode  PetscRandomGetValueReal_Sprng(PetscRandom r,PetscReal *val)
 34: {
 36: #if defined(PETSC_USE_COMPLEX)
 37:   if (r->iset) *val = PetscRealPart(r->width)*sprng() + PetscRealPart(r->low);
 38:   else         *val = sprng();
 39: #else
 40:   if (r->iset) *val = r->width * sprng() + r->low;
 41:   else         *val = sprng();
 42: #endif
 43:   return(0);
 44: }

 46: static struct _PetscRandomOps PetscRandomOps_Values = {
 47:   PetscRandomSeed_Sprng,
 48:   PetscRandomGetValue_Sprng,
 49:   PetscRandomGetValueReal_Sprng,
 50:   NULL,
 51:   NULL,
 52:   NULL,
 53:   NULL
 54: };

 56: /*MC
 57:    PETSCSPRNG- access to the publically available random number generator sprng

 59:    Options Database Keys:
 60: . -random_type <rand,rand48,sprng>

 62:   Level: beginner

 64:    PETSc must have been ./configure with the option --download-sprng to use
 65:    this random number generator.

 67:    This is NOT currently using a parallel random number generator. Sprng does have
 68:    an MPI version we should investigate.

 70: .seealso: RandomCreate(), RandomSetType(), PETSCRAND, PETSCRAND48
 71: M*/

 73: PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom r)
 74: {

 78:   PetscMemcpy(r->ops,&PetscRandomOps_Values,sizeof(PetscRandomOps_Values));
 79:   PetscObjectChangeTypeName((PetscObject)r,PETSCSPRNG);
 80:   return(0);
 81: }