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: }