xref: /petsc/src/sys/classes/random/interface/randreg.c (revision 285fb4e2b69b3de46a0633bd0adc6a7f684caa1e)
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:
108     For an example of the code needed to interface your own random number generator see
109          src/sys/random/impls/rand/rand.c
110 
111   Level: advanced
112 
113 .keywords: PetscRandom, register
114 
115 .seealso: PetscRandomRegisterAll(), PetscRandomRegisterDestroy(), PetscRandomRegister()
116 @*/
117 PetscErrorCode  PetscRandomRegister(const char sname[], PetscErrorCode (*function)(PetscRandom))
118 {
119   PetscErrorCode ierr;
120 
121   PetscFunctionBegin;
122   ierr = PetscFunctionListAdd(&PetscRandomList,sname,function);CHKERRQ(ierr);
123   PetscFunctionReturn(0);
124 }
125 
126 #if defined(PETSC_HAVE_RAND)
127 PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom);
128 #endif
129 #if defined(PETSC_HAVE_DRAND48)
130 PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand48(PetscRandom);
131 #endif
132 #if defined(PETSC_HAVE_SPRNG)
133 PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom);
134 #endif
135 PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rander48(PetscRandom);
136 #if defined(PETSC_HAVE_RANDOM123)
137 PETSC_EXTERN PetscErrorCode PetscRandomCreate_Random123(PetscRandom);
138 #endif
139 
140 /*@C
141   PetscRandomRegisterAll - Registers all of the components in the PetscRandom package.
142 
143   Not Collective
144 
145   Level: advanced
146 
147 .keywords: PetscRandom, register, all
148 .seealso:  PetscRandomRegister(), PetscRandomRegisterDestroy()
149 @*/
150 PetscErrorCode  PetscRandomRegisterAll(void)
151 {
152   PetscErrorCode ierr;
153 
154   PetscFunctionBegin;
155   if (PetscRandomRegisterAllCalled) PetscFunctionReturn(0);
156   PetscRandomRegisterAllCalled = PETSC_TRUE;
157 #if defined(PETSC_HAVE_RAND)
158   ierr = PetscRandomRegister(PETSCRAND,  PetscRandomCreate_Rand);CHKERRQ(ierr);
159 #endif
160 #if defined(PETSC_HAVE_DRAND48)
161   ierr = PetscRandomRegister(PETSCRAND48,PetscRandomCreate_Rand48);CHKERRQ(ierr);
162 #endif
163 #if defined(PETSC_HAVE_SPRNG)
164   ierr = PetscRandomRegister(PETSCSPRNG, PetscRandomCreate_Sprng);CHKERRQ(ierr);
165 #endif
166   ierr = PetscRandomRegister(PETSCRANDER48,PetscRandomCreate_Rander48);CHKERRQ(ierr);
167 #if defined(PETSC_HAVE_RANDOM123)
168   ierr = PetscRandomRegister(PETSCRANDOM123, PetscRandomCreate_Random123);CHKERRQ(ierr);
169 #endif
170   PetscFunctionReturn(0);
171 }
172 
173