Actual source code: rand.c

      1: #include <petsc/private/randomimpl.h>

      3: static PetscErrorCode PetscRandomSeed_Rand(PetscRandom r)
      4: {
      5:   PetscFunctionBegin;
      6:   srand((unsigned int)r->seed);
      7:   PetscFunctionReturn(PETSC_SUCCESS);
      8: }

     10: #define RAND_WRAP ((PetscReal)(rand() / (double)((unsigned int)RAND_MAX + 1)))
     11: static PetscErrorCode PetscRandomGetValue_Rand(PetscRandom r, PetscScalar *val)
     12: {
     13:   PetscFunctionBegin;
     14: #if defined(PETSC_USE_COMPLEX)
     15:   if (r->iset) *val = PetscRealPart(r->width) * RAND_WRAP + PetscRealPart(r->low) + (PetscImaginaryPart(r->width) * RAND_WRAP + PetscImaginaryPart(r->low)) * PETSC_i;
     16:   else *val = RAND_WRAP + RAND_WRAP * PETSC_i;
     17: #else
     18:   if (r->iset) *val = r->width * RAND_WRAP + r->low;
     19:   else *val = RAND_WRAP;
     20: #endif
     21:   PetscFunctionReturn(PETSC_SUCCESS);
     22: }

     24: static PetscErrorCode PetscRandomGetValueReal_Rand(PetscRandom r, PetscReal *val)
     25: {
     26:   PetscFunctionBegin;
     27: #if defined(PETSC_USE_COMPLEX)
     28:   if (r->iset) *val = PetscRealPart(r->width) * RAND_WRAP + PetscRealPart(r->low);
     29:   else *val = RAND_WRAP;
     30: #else
     31:   if (r->iset) *val = r->width * RAND_WRAP + r->low;
     32:   else *val = RAND_WRAP;
     33: #endif
     34:   PetscFunctionReturn(PETSC_SUCCESS);
     35: }

     37: static struct _PetscRandomOps PetscRandomOps_Values = {
     38:   PetscDesignatedInitializer(seed, PetscRandomSeed_Rand),
     39:   PetscDesignatedInitializer(getvalue, PetscRandomGetValue_Rand),
     40:   PetscDesignatedInitializer(getvaluereal, PetscRandomGetValueReal_Rand),
     41:   PetscDesignatedInitializer(getvalues, NULL),
     42:   PetscDesignatedInitializer(getvaluesreal, NULL),
     43:   PetscDesignatedInitializer(destroy, NULL),
     44:   PetscDesignatedInitializer(setfromoptions, NULL),
     45: };

     47: /*MC
     48:    PETSCRAND - access to the basic Unix random number generator

     50:    Options Database Key:
     51: . -random_type (rander48|rand|rand48|sprng|random123|curand) - set the random number generator from the options database, see `PetscRandomType`.

     53:   Level: beginner

     55:   Note:
     56:   Not recommended since it can produce different numbers on different systems

     58: .seealso: `PetscRandomCreate()`, `PetscRandomSetType()`, `PETSCRAND48`, `PETSCSPRNG`, `PetscRandomSetFromOptions()`, `PetscRandomType`
     59: M*/

     61: PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom r)
     62: {
     63:   PetscFunctionBegin;
     64:   r->ops[0] = PetscRandomOps_Values;
     65:   PetscCall(PetscObjectChangeTypeName((PetscObject)r, PETSCRAND));
     66:   PetscFunctionReturn(PETSC_SUCCESS);
     67: }