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