Date: 2022-08-02T03:13:20+00:00

Actual source code: randreg.c

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

      4: PetscFunctionList PetscRandomList              = NULL;
      5: PetscBool         PetscRandomRegisterAllCalled = PETSC_FALSE;

      7: /*@C
      8:   PetscRandomSetType - Builds a context for generating particular type of random numbers.

     10:   Collective on PetscRandom

     12:   Input Parameters:
     13: + rnd   - The random number generator context
     14: - type - The name of the random type

     16:   Options Database Key:
     17: . -random_type <type> - Sets the random type; use -help for a list
     18:                      of available types

     20:   Notes:
     21:   See "petsc/include/petscsys.h" for available random types (for instance, PETSCRAND48, PETSCRAND).

     23:   Level: intermediate

     25: .seealso: PetscRandomGetType(), PetscRandomCreate()
     26: @*/

     28: PetscErrorCode  PetscRandomSetType(PetscRandom rnd, PetscRandomType type)
     29: {
     30:   PetscErrorCode (*r)(PetscRandom);
     31:   PetscBool      match;

     34:   PetscObjectTypeCompare((PetscObject)rnd, type, &match);
     35:   if (match) return 0;

     37:   PetscFunctionListFind(PetscRandomList,type,&r);

     40:   if (rnd->ops->destroy) {
     41:     (*rnd->ops->destroy)(rnd);

     43:     rnd->ops->destroy = NULL;
     44:   }
     45:   (*r)(rnd);
     46:   PetscRandomSeed(rnd);

     48:   PetscObjectChangeTypeName((PetscObject)rnd, type);
     49:   return 0;
     50: }

     52: /*@C
     53:   PetscRandomGetType - Gets the type name (as a string) from the PetscRandom.

     55:   Not Collective

     57:   Input Parameter:
     58: . rnd  - The random number generator context

     60:   Output Parameter:
     61: . type - The type name

     63:   Level: intermediate

     65: .seealso: PetscRandomSetType(), PetscRandomCreate()
     66: @*/
     67: PetscErrorCode  PetscRandomGetType(PetscRandom rnd, PetscRandomType *type)
     68: {
     71:   *type = ((PetscObject)rnd)->type_name;
     72:   return 0;
     73: }

     75: /*@C
     76:   PetscRandomRegister -  Adds a new PetscRandom component implementation

     78:   Not Collective

     80:   Input Parameters:
     81: + name        - The name of a new user-defined creation routine
     82: - create_func - The creation routine itself

     84:   Notes:
     85:   PetscRandomRegister() may be called multiple times to add several user-defined randome number generators

     87:   Sample usage:
     88: .vb
     89:     PetscRandomRegister("my_rand",  MyPetscRandomtorCreate);
     90: .ve

     92:   Then, your random type can be chosen with the procedural interface via
     93: .vb
     94:     PetscRandomCreate(MPI_Comm, PetscRandom *);
     95:     PetscRandomSetType(PetscRandom,"my_random_name");
     96: .ve
     97:    or at runtime via the option
     98: .vb
     99:     -random_type my_random_name
    100: .ve

    102:   Notes:
    103:     For an example of the code needed to interface your own random number generator see
    104:          src/sys/random/impls/rand/rand.c

    106:   Level: advanced

    108: .seealso: PetscRandomRegisterAll(), PetscRandomRegisterDestroy(), PetscRandomRegister()
    109: @*/
    110: PetscErrorCode  PetscRandomRegister(const char sname[], PetscErrorCode (*function)(PetscRandom))
    111: {
    112:   PetscRandomInitializePackage();
    113:   PetscFunctionListAdd(&PetscRandomList,sname,function);
    114:   return 0;
    115: }

    117: #if defined(PETSC_HAVE_RAND)
    118: PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom);
    119: #endif
    120: #if defined(PETSC_HAVE_DRAND48)
    121: PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand48(PetscRandom);
    122: #endif
    123: #if defined(PETSC_HAVE_SPRNG)
    124: PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom);
    125: #endif
    126: PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rander48(PetscRandom);
    127: #if defined(PETSC_HAVE_RANDOM123)
    128: PETSC_EXTERN PetscErrorCode PetscRandomCreate_Random123(PetscRandom);
    129: #endif
    130: #if defined(PETSC_HAVE_CUDA)
    131: PETSC_EXTERN PetscErrorCode PetscRandomCreate_CURAND(PetscRandom);
    132: #endif

    134: /*@C
    135:   PetscRandomRegisterAll - Registers all of the components in the PetscRandom package.

    137:   Not Collective

    139:   Level: advanced

    141: .seealso:  PetscRandomRegister(), PetscRandomRegisterDestroy()
    142: @*/
    143: PetscErrorCode  PetscRandomRegisterAll(void)
    144: {
    145:   if (PetscRandomRegisterAllCalled) return 0;
    146:   PetscRandomRegisterAllCalled = PETSC_TRUE;
    147: #if defined(PETSC_HAVE_RAND)
    148:   PetscRandomRegister(PETSCRAND,PetscRandomCreate_Rand);
    149: #endif
    150: #if defined(PETSC_HAVE_DRAND48)
    151:   PetscRandomRegister(PETSCRAND48,PetscRandomCreate_Rand48);
    152: #endif
    153: #if defined(PETSC_HAVE_SPRNG)
    154:   PetscRandomRegister(PETSCSPRNG,PetscRandomCreate_Sprng);
    155: #endif
    156:   PetscRandomRegister(PETSCRANDER48,PetscRandomCreate_Rander48);
    157: #if defined(PETSC_HAVE_RANDOM123)
    158:   PetscRandomRegister(PETSCRANDOM123,PetscRandomCreate_Random123);
    159: #endif
    160: #if defined(PETSC_HAVE_CUDA)
    161:   PetscRandomRegister(PETSCCURAND,PetscRandomCreate_CURAND);
    162: #endif
    163:   return 0;
    164: }