Date: 2022-03-31T04:46:03+00:00

Actual source code: rand48.c

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

      4: PetscErrorCode  PetscRandomSeed_Rand48(PetscRandom r)
      5: {
      6:   srand48(r->seed);
      7:   return 0;
      8: }

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

     25: PetscErrorCode  PetscRandomGetValueReal_Rand48(PetscRandom r,PetscReal *val)
     26: {
     27: #if defined(PETSC_USE_COMPLEX)
     28:   if (r->iset) *val = PetscRealPart(r->width)*drand48() + PetscRealPart(r->low);
     29:   else         *val = drand48();
     30: #else
     31:   if (r->iset) *val = r->width * drand48() + r->low;
     32:   else         *val = drand48();
     33: #endif
     34:   return 0;
     35: }

     37: static struct _PetscRandomOps PetscRandomOps_Values = {
     38:   PetscDesignatedInitializer(seed,PetscRandomSeed_Rand48),
     39:   PetscDesignatedInitializer(getvalue,PetscRandomGetValue_Rand48),
     40:   PetscDesignatedInitializer(getvaluereal,PetscRandomGetValueReal_Rand48),
     41: };

     43: /*MC
     44:    PETSCRAND48 - access to the basic Unix drand48() random number generator

     46:    Options Database Keys:
     47: . -random_type <rand,rand48,sprng>

     49:   Level: beginner

     51: .seealso: PetscRandomCreate(), PetscRandomSetType(), PETSCRAND, PETSCSPRNG
     52: M*/

     54: PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand48(PetscRandom r)
     55: {
     56:   PetscMemcpy(r->ops,&PetscRandomOps_Values,sizeof(PetscRandomOps_Values));
     57:   PetscObjectChangeTypeName((PetscObject)r,PETSCRAND48);
     58:   return 0;
     59: }