xref: /petsc/src/sys/classes/random/interface/randreg.c (revision 22d28d0898e9654d85ab75d133853ba201e99be3)
1 
2 #include <../src/sys/classes/random/randomimpl.h>         /*I "petscsys.h" I*/
3 
4 PetscFList PetscRandomList              = PETSC_NULL;
5 PetscBool  PetscRandomRegisterAllCalled = PETSC_FALSE;
6 
7 #undef __FUNCT__
8 #define __FUNCT__ "PetscRandomSetType"
9 /*@C
10   PetscRandomSetType - Builds a context for generating particular type of random numbers.
11 
12   Collective on PetscRandom
13 
14   Input Parameters:
15 + rnd   - The random number generator context
16 - type - The name of the random type
17 
18   Options Database Key:
19 . -random_type <type> - Sets the random type; use -help for a list
20                      of available types
21 
22   Notes:
23   See "petsc/include/petscsys.h" for available random types (for instance, PETSCRAND48, PETSCRAND).
24 
25   Level: intermediate
26 
27 .keywords: random, set, type
28 .seealso: PetscRandomGetType(), PetscRandomCreate()
29 @*/
30 
31 PetscErrorCode  PetscRandomSetType(PetscRandom rnd, PetscRandomType type)
32 {
33   PetscErrorCode (*r)(PetscRandom);
34   PetscBool      match;
35   PetscErrorCode ierr;
36 
37   PetscFunctionBegin;
38   PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID,1);
39   ierr = PetscObjectTypeCompare((PetscObject)rnd, type, &match);CHKERRQ(ierr);
40   if (match) PetscFunctionReturn(0);
41 
42   ierr = PetscFListFind(PetscRandomList,((PetscObject)rnd)->comm,  type,PETSC_TRUE,(void (**)(void)) &r);CHKERRQ(ierr);
43   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown random type: %s", type);
44 
45   if (rnd->ops->destroy) {
46     ierr = (*rnd->ops->destroy)(rnd);CHKERRQ(ierr);
47     rnd->ops->destroy = PETSC_NULL;
48   }
49   ierr = (*r)(rnd);CHKERRQ(ierr);
50   ierr = PetscRandomSeed(rnd);CHKERRQ(ierr);
51 
52   ierr = PetscObjectChangeTypeName((PetscObject)rnd, type);CHKERRQ(ierr);
53 #if defined(PETSC_HAVE_AMS)
54   if (PetscAMSPublishAll) {
55     ierr = PetscObjectAMSPublish((PetscObject)rnd);CHKERRQ(ierr);
56   }
57 #endif
58   PetscFunctionReturn(0);
59 }
60 
61 #undef __FUNCT__
62 #define __FUNCT__ "PetscRandomGetType"
63 /*@C
64   PetscRandomGetType - Gets the type name (as a string) from the PetscRandom.
65 
66   Not Collective
67 
68   Input Parameter:
69 . rnd  - The random number generator context
70 
71   Output Parameter:
72 . type - The type name
73 
74   Level: intermediate
75 
76 .keywords: random, get, type, name
77 .seealso: PetscRandomSetType(), PetscRandomCreate()
78 @*/
79 PetscErrorCode  PetscRandomGetType(PetscRandom rnd, PetscRandomType *type)
80 {
81   PetscFunctionBegin;
82   PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID,1);
83   PetscValidPointer(type,2);
84   *type = ((PetscObject)rnd)->type_name;
85   PetscFunctionReturn(0);
86 }
87 
88 #undef __FUNCT__
89 #define __FUNCT__ "PetscRandomRegister"
90 /*@C
91   PetscRandomRegister - See PetscRandomRegisterDynamic()
92 
93   Level: advanced
94 @*/
95 PetscErrorCode  PetscRandomRegister(const char sname[], const char path[], const char name[], PetscErrorCode (*function)(PetscRandom))
96 {
97   char           fullname[PETSC_MAX_PATH_LEN];
98   PetscErrorCode ierr;
99 
100   PetscFunctionBegin;
101   ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr);
102   ierr = PetscFListAdd(&PetscRandomList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr);
103   PetscFunctionReturn(0);
104 }
105 
106 
107 /*--------------------------------------------------------------------------------------------------------------------*/
108 #undef __FUNCT__
109 #define __FUNCT__ "PetscRandomRegisterDestroy"
110 /*@C
111    PetscRandomRegisterDestroy - Frees the list of Random types that were registered by PetscRandomRegister()/PetscRandomRegisterDynamic().
112 
113    Not Collective
114 
115    Level: advanced
116 
117 .keywords: PetscRandom, register, destroy
118 .seealso: PetscRandomRegister(), PetscRandomRegisterAll(), PetscRandomRegisterDynamic()
119 @*/
120 PetscErrorCode  PetscRandomRegisterDestroy(void)
121 {
122   PetscErrorCode ierr;
123 
124   PetscFunctionBegin;
125   ierr = PetscFListDestroy(&PetscRandomList);CHKERRQ(ierr);
126   PetscRandomRegisterAllCalled = PETSC_FALSE;
127   PetscFunctionReturn(0);
128 }
129 
130 EXTERN_C_BEGIN
131 #if defined(PETSC_HAVE_RAND)
132 extern PetscErrorCode  PetscRandomCreate_Rand(PetscRandom);
133 #endif
134 #if defined(PETSC_HAVE_DRAND48)
135 extern PetscErrorCode  PetscRandomCreate_Rand48(PetscRandom);
136 #endif
137 #if defined(PETSC_HAVE_SPRNG)
138 extern PetscErrorCode  PetscRandomCreate_Sprng(PetscRandom);
139 #endif
140 EXTERN_C_END
141 
142 #undef __FUNCT__
143 #define __FUNCT__ "PetscRandomRegisterAll"
144 /*@C
145   PetscRandomRegisterAll - Registers all of the components in the PetscRandom package.
146 
147   Not Collective
148 
149   Input parameter:
150 . path - The dynamic library path
151 
152   Level: advanced
153 
154 .keywords: PetscRandom, register, all
155 .seealso:  PetscRandomRegister(), PetscRandomRegisterDestroy(), PetscRandomRegisterDynamic()
156 @*/
157 PetscErrorCode  PetscRandomRegisterAll(const char path[])
158 {
159   PetscErrorCode ierr;
160 
161   PetscFunctionBegin;
162   PetscRandomRegisterAllCalled = PETSC_TRUE;
163 #if defined(PETSC_HAVE_RAND)
164   ierr = PetscRandomRegisterDynamic(PETSCRAND,  path,"PetscRandomCreate_Rand",  PetscRandomCreate_Rand);CHKERRQ(ierr);
165 #endif
166 #if defined(PETSC_HAVE_DRAND48)
167   ierr = PetscRandomRegisterDynamic(PETSCRAND48,path,"PetscRandomCreate_Rand48",PetscRandomCreate_Rand48);CHKERRQ(ierr);
168 #endif
169 #if defined(PETSC_HAVE_SPRNG)
170   ierr = PetscRandomRegisterDynamic(PETSCSPRNG,path,"PetscRandomCreate_Sprng",PetscRandomCreate_Sprng);CHKERRQ(ierr);
171 #endif
172   PetscFunctionReturn(0);
173 }
174 
175