Date: 2025-03-29T05:58:42+00:00

Actual source code: rand48.c

      1: #define PETSC_DESIRE_FEATURE_TEST_MACROS /* for drand48() */
      2: #include <petsc/private/randomimpl.h>

      4: static PetscErrorCode PetscRandomSeed_Rand48(PetscRandom r)
      5: {
      6:   PetscFunctionBegin;
      7:   srand48(r->seed);
      8:   PetscFunctionReturn(PETSC_SUCCESS);
      9: }

     11: static PetscErrorCode PetscRandomGetValue_Rand48(PetscRandom r, PetscScalar *val)
     12: {
     13:   PetscFunctionBegin;
     14: #if defined(PETSC_USE_COMPLEX)
     15:   if (r->iset) {
     16:     *val = PetscRealPart(r->width) * (PetscReal)drand48() + PetscRealPart(r->low) + (PetscImaginaryPart(r->width) * (PetscReal)drand48() + PetscImaginaryPart(r->low)) * PETSC_i;
     17:   } else {
     18:     *val = (PetscReal)drand48() + (PetscReal)drand48() * PETSC_i;
     19:   }
     20: #else
     21:   if (r->iset) *val = r->width * drand48() + r->low;
     22:   else *val = drand48();
     23: #endif
     24:   PetscFunctionReturn(PETSC_SUCCESS);
     25: }

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

     40: static struct _PetscRandomOps PetscRandomOps_Values = {
     41:   PetscDesignatedInitializer(seed, PetscRandomSeed_Rand48),
     42:   PetscDesignatedInitializer(getvalue, PetscRandomGetValue_Rand48),
     43:   PetscDesignatedInitializer(getvaluereal, PetscRandomGetValueReal_Rand48),
     44:   PetscDesignatedInitializer(getvalues, NULL),
     45:   PetscDesignatedInitializer(getvaluesreal, NULL),
     46:   PetscDesignatedInitializer(destroy, NULL),
     47:   PetscDesignatedInitializer(setfromoptions, NULL),
     48: };

     50: /*MC
     51:    PETSCRAND48 - access to the basic Unix `drand48()` random number generator

     53:    Options Database Key:
     54: . -random_type <rand,rand48,sprng> - select the random number generator at runtime

     56:   Level: beginner

     58:   Note:
     59:   Not recommended because it may produce different results on different systems.

     61: .seealso: `PetscRandomCreate()`, `PetscRandomSetType()`, `PETSCRAND`, `PETSCSPRNG`, `PetscRandomSetFromOptions()`
     62: M*/

     64: PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand48(PetscRandom r)
     65: {
     66:   PetscFunctionBegin;
     67:   r->ops[0] = PetscRandomOps_Values;
     68:   PetscCall(PetscObjectChangeTypeName((PetscObject)r, PETSCRAND48));
     69:   PetscFunctionReturn(PETSC_SUCCESS);
     70: }