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