Actual source code: randreg.c
 
   petsc-3.7.7 2017-09-25
   
  2: #include <../src/sys/classes/random/randomimpl.h>         /*I "petscsys.h" I*/
  4: PetscFunctionList PetscRandomList              = NULL;
  5: PetscBool         PetscRandomRegisterAllCalled = PETSC_FALSE;
  9: /*@C
 10:   PetscRandomSetType - Builds a context for generating particular type of random numbers.
 12:   Collective on PetscRandom
 14:   Input Parameters:
 15: + rnd   - The random number generator context
 16: - type - The name of the random type
 18:   Options Database Key:
 19: . -random_type <type> - Sets the random type; use -help for a list
 20:                      of available types
 22:   Notes:
 23:   See "petsc/include/petscsys.h" for available random types (for instance, PETSCRAND48, PETSCRAND).
 25:   Level: intermediate
 27: .keywords: random, set, type
 28: .seealso: PetscRandomGetType(), PetscRandomCreate()
 29: @*/
 31: PetscErrorCode  PetscRandomSetType(PetscRandom rnd, PetscRandomType type)
 32: {
 33:   PetscErrorCode (*r)(PetscRandom);
 34:   PetscBool      match;
 39:   PetscObjectTypeCompare((PetscObject)rnd, type, &match);
 40:   if (match) return(0);
 42:   PetscFunctionListFind(PetscRandomList,type,&r);
 43:   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown random type: %s", type);
 45:   if (rnd->ops->destroy) {
 46:     (*rnd->ops->destroy)(rnd);
 48:     rnd->ops->destroy = NULL;
 49:   }
 50:   (*r)(rnd);
 51:   PetscRandomSeed(rnd);
 53:   PetscObjectChangeTypeName((PetscObject)rnd, type);
 54:   return(0);
 55: }
 59: /*@C
 60:   PetscRandomGetType - Gets the type name (as a string) from the PetscRandom.
 62:   Not Collective
 64:   Input Parameter:
 65: . rnd  - The random number generator context
 67:   Output Parameter:
 68: . type - The type name
 70:   Level: intermediate
 72: .keywords: random, get, type, name
 73: .seealso: PetscRandomSetType(), PetscRandomCreate()
 74: @*/
 75: PetscErrorCode  PetscRandomGetType(PetscRandom rnd, PetscRandomType *type)
 76: {
 80:   *type = ((PetscObject)rnd)->type_name;
 81:   return(0);
 82: }
 86: /*@C
 87:   PetscRandomRegister -  Adds a new PetscRandom component implementation
 89:   Not Collective
 91:   Input Parameters:
 92: + name        - The name of a new user-defined creation routine
 93: - create_func - The creation routine itself
 95:   Notes:
 96:   PetscRandomRegister() may be called multiple times to add several user-defined randome number generators
 98:   Sample usage:
 99: .vb
100:     PetscRandomRegister("my_rand",  MyPetscRandomtorCreate);
101: .ve
103:   Then, your random type can be chosen with the procedural interface via
104: .vb
105:     PetscRandomCreate(MPI_Comm, PetscRandom *);
106:     PetscRandomSetType(PetscRandom,"my_random_name");
107: .ve
108:    or at runtime via the option
109: .vb
110:     -random_type my_random_name
111: .ve
113:   Notes: For an example of the code needed to interface your own random number generator see
114:          src/sys/random/impls/rand/rand.c
116:   Level: advanced
118: .keywords: PetscRandom, register
120: .seealso: PetscRandomRegisterAll(), PetscRandomRegisterDestroy(), PetscRandomRegister()
121: @*/
122: PetscErrorCode  PetscRandomRegister(const char sname[], PetscErrorCode (*function)(PetscRandom))
123: {
127:   PetscFunctionListAdd(&PetscRandomList,sname,function);
128:   return(0);
129: }
131: #if defined(PETSC_HAVE_RAND)
132: PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom);
133: #endif
134: #if defined(PETSC_HAVE_DRAND48)
135: PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand48(PetscRandom);
136: #endif
137: #if defined(PETSC_HAVE_SPRNG)
138: PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom);
139: #endif
140: PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rander48(PetscRandom);
144: /*@C
145:   PetscRandomRegisterAll - Registers all of the components in the PetscRandom package.
147:   Not Collective
149:   Level: advanced
151: .keywords: PetscRandom, register, all
152: .seealso:  PetscRandomRegister(), PetscRandomRegisterDestroy()
153: @*/
154: PetscErrorCode  PetscRandomRegisterAll(void)
155: {
159:   if (PetscRandomRegisterAllCalled) return(0);
160:   PetscRandomRegisterAllCalled = PETSC_TRUE;
161: #if defined(PETSC_HAVE_RAND)
162:   PetscRandomRegister(PETSCRAND,  PetscRandomCreate_Rand);
163: #endif
164: #if defined(PETSC_HAVE_DRAND48)
165:   PetscRandomRegister(PETSCRAND48,PetscRandomCreate_Rand48);
166: #endif
167: #if defined(PETSC_HAVE_SPRNG)
168:   PetscRandomRegister(PETSCSPRNG, PetscRandomCreate_Sprng);
169: #endif
170:   PetscRandomRegister(PETSCRANDER48,PetscRandomCreate_Rander48);
171:   return(0);
172: }