Actual source code: sprng.c


  2: #include <petsc/private/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: {
 12:   PetscFunctionBegin;
 13:   init_sprng(r->seed, SPRNG_DEFAULT);
 14:   PetscFunctionReturn(PETSC_SUCCESS);
 15: }

 17: PetscErrorCode PetscRandomGetValue_Sprng(PetscRandom r, PetscScalar *val)
 18: {
 19:   PetscFunctionBegin;
 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:   PetscFunctionReturn(PETSC_SUCCESS);
 31: }

 33: PetscErrorCode PetscRandomGetValueReal_Sprng(PetscRandom r, PetscReal *val)
 34: {
 35:   PetscFunctionBegin;
 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:   PetscFunctionReturn(PETSC_SUCCESS);
 44: }

 46: static struct _PetscRandomOps PetscRandomOps_Values = {
 47:   PetscDesignatedInitializer(seed, PetscRandomSeed_Sprng),
 48:   PetscDesignatedInitializer(getvalue, PetscRandomGetValue_Sprng),
 49:   PetscDesignatedInitializer(getvaluereal, PetscRandomGetValueReal_Sprng),
 50: };

 52: /*MC
 53:    PETSCSPRNG - access to the publicly available random number generator sprng

 55:    Options Database Keys:
 56: . -random_type <rand,rand48,sprng> - select the random number generator at runtime

 58:    Note:
 59:    PETSc must be ./configure with the option --download-sprng to use this random number generator.

 61:    Developer Note:
 62:    This is NOT currently using a parallel random number generator. Sprng does have
 63:    an MPI version we should investigate.

 65:   Level: beginner

 67: .seealso: `RandomCreate()`, `RandomSetType()`, `PETSCRAND`, `PETSCRAND48`, `PetscRandomSetFromOptions()`
 68: M*/

 70: PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom r)
 71: {
 72:   PetscFunctionBegin;
 73:   PetscCall(PetscMemcpy(r->ops, &PetscRandomOps_Values, sizeof(PetscRandomOps_Values)));
 74:   PetscCall(PetscObjectChangeTypeName((PetscObject)r, PETSCSPRNG));
 75:   PetscFunctionReturn(PETSC_SUCCESS);
 76: }