Actual source code: randreg.c
petsc-3.14.6 2021-03-30
2: #include <../src/sys/classes/random/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;
36: PetscObjectTypeCompare((PetscObject)rnd, type, &match);
37: if (match) return(0);
39: PetscFunctionListFind(PetscRandomList,type,&r);
40: if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown random type: %s", type);
42: if (rnd->ops->destroy) {
43: (*rnd->ops->destroy)(rnd);
45: rnd->ops->destroy = NULL;
46: }
47: (*r)(rnd);
48: PetscRandomSeed(rnd);
50: PetscObjectChangeTypeName((PetscObject)rnd, type);
51: return(0);
52: }
54: /*@C
55: PetscRandomGetType - Gets the type name (as a string) from the PetscRandom.
57: Not Collective
59: Input Parameter:
60: . rnd - The random number generator context
62: Output Parameter:
63: . type - The type name
65: Level: intermediate
67: .seealso: PetscRandomSetType(), PetscRandomCreate()
68: @*/
69: PetscErrorCode PetscRandomGetType(PetscRandom rnd, PetscRandomType *type)
70: {
74: *type = ((PetscObject)rnd)->type_name;
75: return(0);
76: }
78: /*@C
79: PetscRandomRegister - Adds a new PetscRandom component implementation
81: Not Collective
83: Input Parameters:
84: + name - The name of a new user-defined creation routine
85: - create_func - The creation routine itself
87: Notes:
88: PetscRandomRegister() may be called multiple times to add several user-defined randome number generators
90: Sample usage:
91: .vb
92: PetscRandomRegister("my_rand", MyPetscRandomtorCreate);
93: .ve
95: Then, your random type can be chosen with the procedural interface via
96: .vb
97: PetscRandomCreate(MPI_Comm, PetscRandom *);
98: PetscRandomSetType(PetscRandom,"my_random_name");
99: .ve
100: or at runtime via the option
101: .vb
102: -random_type my_random_name
103: .ve
105: Notes:
106: For an example of the code needed to interface your own random number generator see
107: src/sys/random/impls/rand/rand.c
109: Level: advanced
111: .seealso: PetscRandomRegisterAll(), PetscRandomRegisterDestroy(), PetscRandomRegister()
112: @*/
113: PetscErrorCode PetscRandomRegister(const char sname[], PetscErrorCode (*function)(PetscRandom))
114: {
118: PetscRandomInitializePackage();
119: PetscFunctionListAdd(&PetscRandomList,sname,function);
120: return(0);
121: }
123: #if defined(PETSC_HAVE_RAND)
124: PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom);
125: #endif
126: #if defined(PETSC_HAVE_DRAND48)
127: PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand48(PetscRandom);
128: #endif
129: #if defined(PETSC_HAVE_SPRNG)
130: PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom);
131: #endif
132: PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rander48(PetscRandom);
133: #if defined(PETSC_HAVE_RANDOM123)
134: PETSC_EXTERN PetscErrorCode PetscRandomCreate_Random123(PetscRandom);
135: #endif
137: /*@C
138: PetscRandomRegisterAll - Registers all of the components in the PetscRandom package.
140: Not Collective
142: Level: advanced
144: .seealso: PetscRandomRegister(), PetscRandomRegisterDestroy()
145: @*/
146: PetscErrorCode PetscRandomRegisterAll(void)
147: {
151: if (PetscRandomRegisterAllCalled) return(0);
152: PetscRandomRegisterAllCalled = PETSC_TRUE;
153: #if defined(PETSC_HAVE_RAND)
154: PetscRandomRegister(PETSCRAND, PetscRandomCreate_Rand);
155: #endif
156: #if defined(PETSC_HAVE_DRAND48)
157: PetscRandomRegister(PETSCRAND48,PetscRandomCreate_Rand48);
158: #endif
159: #if defined(PETSC_HAVE_SPRNG)
160: PetscRandomRegister(PETSCSPRNG, PetscRandomCreate_Sprng);
161: #endif
162: PetscRandomRegister(PETSCRANDER48,PetscRandomCreate_Rander48);
163: #if defined(PETSC_HAVE_RANDOM123)
164: PetscRandomRegister(PETSCRANDOM123, PetscRandomCreate_Random123);
165: #endif
166: return(0);
167: }