xref: /petsc/src/sys/classes/random/interface/randreg.c (revision 245f004be2b2fca55a62739415aedaade1b4b42e)
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 #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 = PetscFunctionListFind(((PetscObject)rnd)->comm,PetscRandomList,  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 
48     rnd->ops->destroy = NULL;
49   }
50   ierr = (*r)(rnd);CHKERRQ(ierr);
51   ierr = PetscRandomSeed(rnd);CHKERRQ(ierr);
52 
53   ierr = PetscObjectChangeTypeName((PetscObject)rnd, type);CHKERRQ(ierr);
54 #if defined(PETSC_HAVE_AMS)
55   if (PetscAMSPublishAll) {
56     ierr = PetscObjectAMSPublish((PetscObject)rnd);CHKERRQ(ierr);
57   }
58 #endif
59   PetscFunctionReturn(0);
60 }
61 
62 #undef __FUNCT__
63 #define __FUNCT__ "PetscRandomGetType"
64 /*@C
65   PetscRandomGetType - Gets the type name (as a string) from the PetscRandom.
66 
67   Not Collective
68 
69   Input Parameter:
70 . rnd  - The random number generator context
71 
72   Output Parameter:
73 . type - The type name
74 
75   Level: intermediate
76 
77 .keywords: random, get, type, name
78 .seealso: PetscRandomSetType(), PetscRandomCreate()
79 @*/
80 PetscErrorCode  PetscRandomGetType(PetscRandom rnd, PetscRandomType *type)
81 {
82   PetscFunctionBegin;
83   PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID,1);
84   PetscValidPointer(type,2);
85   *type = ((PetscObject)rnd)->type_name;
86   PetscFunctionReturn(0);
87 }
88 
89 #undef __FUNCT__
90 #define __FUNCT__ "PetscRandomRegister"
91 /*@C
92   PetscRandomRegister - See PetscRandomRegisterDynamic()
93 
94   Level: advanced
95 @*/
96 PetscErrorCode  PetscRandomRegister(const char sname[], const char path[], const char name[], PetscErrorCode (*function)(PetscRandom))
97 {
98   char           fullname[PETSC_MAX_PATH_LEN];
99   PetscErrorCode ierr;
100 
101   PetscFunctionBegin;
102   ierr = PetscFunctionListConcat(path,name,fullname);CHKERRQ(ierr);
103   ierr = PetscFunctionListAdd(PETSC_COMM_WORLD,&PetscRandomList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr);
104   PetscFunctionReturn(0);
105 }
106 
107 
108 /*--------------------------------------------------------------------------------------------------------------------*/
109 #undef __FUNCT__
110 #define __FUNCT__ "PetscRandomRegisterDestroy"
111 /*@C
112    PetscRandomRegisterDestroy - Frees the list of Random types that were registered by PetscRandomRegister()/PetscRandomRegisterDynamic().
113 
114    Not Collective
115 
116    Level: advanced
117 
118 .keywords: PetscRandom, register, destroy
119 .seealso: PetscRandomRegister(), PetscRandomRegisterAll(), PetscRandomRegisterDynamic()
120 @*/
121 PetscErrorCode  PetscRandomRegisterDestroy(void)
122 {
123   PetscErrorCode ierr;
124 
125   PetscFunctionBegin;
126   ierr = PetscFunctionListDestroy(&PetscRandomList);CHKERRQ(ierr);
127 
128   PetscRandomRegisterAllCalled = PETSC_FALSE;
129   PetscFunctionReturn(0);
130 }
131 
132 EXTERN_C_BEGIN
133 #if defined(PETSC_HAVE_RAND)
134 extern PetscErrorCode  PetscRandomCreate_Rand(PetscRandom);
135 #endif
136 #if defined(PETSC_HAVE_DRAND48)
137 extern PetscErrorCode  PetscRandomCreate_Rand48(PetscRandom);
138 #endif
139 #if defined(PETSC_HAVE_SPRNG)
140 extern PetscErrorCode  PetscRandomCreate_Sprng(PetscRandom);
141 #endif
142 EXTERN_C_END
143 
144 #undef __FUNCT__
145 #define __FUNCT__ "PetscRandomRegisterAll"
146 /*@C
147   PetscRandomRegisterAll - Registers all of the components in the PetscRandom package.
148 
149   Not Collective
150 
151   Input parameter:
152 . path - The dynamic library path
153 
154   Level: advanced
155 
156 .keywords: PetscRandom, register, all
157 .seealso:  PetscRandomRegister(), PetscRandomRegisterDestroy(), PetscRandomRegisterDynamic()
158 @*/
159 PetscErrorCode  PetscRandomRegisterAll(const char path[])
160 {
161   PetscErrorCode ierr;
162 
163   PetscFunctionBegin;
164   PetscRandomRegisterAllCalled = PETSC_TRUE;
165 #if defined(PETSC_HAVE_RAND)
166   ierr = PetscRandomRegisterDynamic(PETSCRAND,  path,"PetscRandomCreate_Rand",  PetscRandomCreate_Rand);CHKERRQ(ierr);
167 #endif
168 #if defined(PETSC_HAVE_DRAND48)
169   ierr = PetscRandomRegisterDynamic(PETSCRAND48,path,"PetscRandomCreate_Rand48",PetscRandomCreate_Rand48);CHKERRQ(ierr);
170 #endif
171 #if defined(PETSC_HAVE_SPRNG)
172   ierr = PetscRandomRegisterDynamic(PETSCSPRNG,path,"PetscRandomCreate_Sprng",PetscRandomCreate_Sprng);CHKERRQ(ierr);
173 #endif
174   PetscFunctionReturn(0);
175 }
176 
177