xref: /petsc/src/sys/classes/random/interface/randreg.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
15c6c1daeSBarry Smith 
2d6cc7855SJacob Faibussowitsch #include <petsc/private/randomimpl.h> /*I "petscsys.h" I*/
35c6c1daeSBarry Smith 
40298fd71SBarry Smith PetscFunctionList PetscRandomList              = NULL;
55c6c1daeSBarry Smith PetscBool         PetscRandomRegisterAllCalled = PETSC_FALSE;
65c6c1daeSBarry Smith 
75c6c1daeSBarry Smith /*@C
85c6c1daeSBarry Smith   PetscRandomSetType - Builds a context for generating particular type of random numbers.
95c6c1daeSBarry Smith 
105c6c1daeSBarry Smith   Collective on PetscRandom
115c6c1daeSBarry Smith 
125c6c1daeSBarry Smith   Input Parameters:
135c6c1daeSBarry Smith + rnd   - The random number generator context
145c6c1daeSBarry Smith - type - The name of the random type
155c6c1daeSBarry Smith 
165c6c1daeSBarry Smith   Options Database Key:
175c6c1daeSBarry Smith . -random_type <type> - Sets the random type; use -help for a list
185c6c1daeSBarry Smith                      of available types
195c6c1daeSBarry Smith 
205c6c1daeSBarry Smith   Notes:
215c6c1daeSBarry Smith   See "petsc/include/petscsys.h" for available random types (for instance, PETSCRAND48, PETSCRAND).
225c6c1daeSBarry Smith 
235c6c1daeSBarry Smith   Level: intermediate
245c6c1daeSBarry Smith 
25db781477SPatrick Sanan .seealso: `PetscRandomGetType()`, `PetscRandomCreate()`
265c6c1daeSBarry Smith @*/
275c6c1daeSBarry Smith 
28*9371c9d4SSatish Balay PetscErrorCode PetscRandomSetType(PetscRandom rnd, PetscRandomType type) {
295c6c1daeSBarry Smith   PetscErrorCode (*r)(PetscRandom);
305c6c1daeSBarry Smith   PetscBool match;
315c6c1daeSBarry Smith 
325c6c1daeSBarry Smith   PetscFunctionBegin;
335c6c1daeSBarry Smith   PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID, 1);
349566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)rnd, type, &match));
355c6c1daeSBarry Smith   if (match) PetscFunctionReturn(0);
365c6c1daeSBarry Smith 
379566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListFind(PetscRandomList, type, &r));
3828b400f6SJacob Faibussowitsch   PetscCheck(r, PETSC_COMM_SELF, PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown random type: %s", type);
395c6c1daeSBarry Smith 
40dbbe0bcdSBarry Smith   PetscTryTypeMethod(rnd, destroy);
410298fd71SBarry Smith   rnd->ops->destroy = NULL;
42dbbe0bcdSBarry Smith 
439566063dSJacob Faibussowitsch   PetscCall((*r)(rnd));
449566063dSJacob Faibussowitsch   PetscCall(PetscRandomSeed(rnd));
455c6c1daeSBarry Smith 
469566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)rnd, type));
475c6c1daeSBarry Smith   PetscFunctionReturn(0);
485c6c1daeSBarry Smith }
495c6c1daeSBarry Smith 
505c6c1daeSBarry Smith /*@C
515c6c1daeSBarry Smith   PetscRandomGetType - Gets the type name (as a string) from the PetscRandom.
525c6c1daeSBarry Smith 
535c6c1daeSBarry Smith   Not Collective
545c6c1daeSBarry Smith 
555c6c1daeSBarry Smith   Input Parameter:
565c6c1daeSBarry Smith . rnd  - The random number generator context
575c6c1daeSBarry Smith 
585c6c1daeSBarry Smith   Output Parameter:
595c6c1daeSBarry Smith . type - The type name
605c6c1daeSBarry Smith 
615c6c1daeSBarry Smith   Level: intermediate
625c6c1daeSBarry Smith 
63db781477SPatrick Sanan .seealso: `PetscRandomSetType()`, `PetscRandomCreate()`
645c6c1daeSBarry Smith @*/
65*9371c9d4SSatish Balay PetscErrorCode PetscRandomGetType(PetscRandom rnd, PetscRandomType *type) {
665c6c1daeSBarry Smith   PetscFunctionBegin;
675c6c1daeSBarry Smith   PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID, 1);
685c6c1daeSBarry Smith   PetscValidPointer(type, 2);
695c6c1daeSBarry Smith   *type = ((PetscObject)rnd)->type_name;
705c6c1daeSBarry Smith   PetscFunctionReturn(0);
715c6c1daeSBarry Smith }
725c6c1daeSBarry Smith 
735c6c1daeSBarry Smith /*@C
741c84c290SBarry Smith   PetscRandomRegister -  Adds a new PetscRandom component implementation
751c84c290SBarry Smith 
761c84c290SBarry Smith   Not Collective
771c84c290SBarry Smith 
781c84c290SBarry Smith   Input Parameters:
791c84c290SBarry Smith + name        - The name of a new user-defined creation routine
801c84c290SBarry Smith - create_func - The creation routine itself
811c84c290SBarry Smith 
821c84c290SBarry Smith   Notes:
831c84c290SBarry Smith   PetscRandomRegister() may be called multiple times to add several user-defined randome number generators
841c84c290SBarry Smith 
851c84c290SBarry Smith   Sample usage:
861c84c290SBarry Smith .vb
87bdf89e91SBarry Smith     PetscRandomRegister("my_rand",  MyPetscRandomtorCreate);
881c84c290SBarry Smith .ve
891c84c290SBarry Smith 
901c84c290SBarry Smith   Then, your random type can be chosen with the procedural interface via
911c84c290SBarry Smith .vb
921c84c290SBarry Smith     PetscRandomCreate(MPI_Comm, PetscRandom *);
931c84c290SBarry Smith     PetscRandomSetType(PetscRandom,"my_random_name");
941c84c290SBarry Smith .ve
951c84c290SBarry Smith    or at runtime via the option
961c84c290SBarry Smith .vb
971c84c290SBarry Smith     -random_type my_random_name
981c84c290SBarry Smith .ve
991c84c290SBarry Smith 
10095452b02SPatrick Sanan   Notes:
10195452b02SPatrick Sanan     For an example of the code needed to interface your own random number generator see
1021c84c290SBarry Smith          src/sys/random/impls/rand/rand.c
1035c6c1daeSBarry Smith 
1045c6c1daeSBarry Smith   Level: advanced
1051c84c290SBarry Smith 
106db781477SPatrick Sanan .seealso: `PetscRandomRegisterAll()`, `PetscRandomRegisterDestroy()`, `PetscRandomRegister()`
1075c6c1daeSBarry Smith @*/
108*9371c9d4SSatish Balay PetscErrorCode PetscRandomRegister(const char sname[], PetscErrorCode (*function)(PetscRandom)) {
1095c6c1daeSBarry Smith   PetscFunctionBegin;
1109566063dSJacob Faibussowitsch   PetscCall(PetscRandomInitializePackage());
1119566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListAdd(&PetscRandomList, sname, function));
1125c6c1daeSBarry Smith   PetscFunctionReturn(0);
1135c6c1daeSBarry Smith }
1145c6c1daeSBarry Smith 
1155c6c1daeSBarry Smith #if defined(PETSC_HAVE_RAND)
1168cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom);
1175c6c1daeSBarry Smith #endif
1185c6c1daeSBarry Smith #if defined(PETSC_HAVE_DRAND48)
1198cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand48(PetscRandom);
1205c6c1daeSBarry Smith #endif
1215c6c1daeSBarry Smith #if defined(PETSC_HAVE_SPRNG)
1228cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom);
1235c6c1daeSBarry Smith #endif
124003ee160SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rander48(PetscRandom);
12525ccb61fSToby Isaac #if defined(PETSC_HAVE_RANDOM123)
12625ccb61fSToby Isaac PETSC_EXTERN PetscErrorCode PetscRandomCreate_Random123(PetscRandom);
12725ccb61fSToby Isaac #endif
128808ba619SStefano Zampini #if defined(PETSC_HAVE_CUDA)
129808ba619SStefano Zampini PETSC_EXTERN PetscErrorCode PetscRandomCreate_CURAND(PetscRandom);
130808ba619SStefano Zampini #endif
1315c6c1daeSBarry Smith 
1325c6c1daeSBarry Smith /*@C
1335c6c1daeSBarry Smith   PetscRandomRegisterAll - Registers all of the components in the PetscRandom package.
1345c6c1daeSBarry Smith 
1355c6c1daeSBarry Smith   Not Collective
1365c6c1daeSBarry Smith 
1375c6c1daeSBarry Smith   Level: advanced
1385c6c1daeSBarry Smith 
139db781477SPatrick Sanan .seealso: `PetscRandomRegister()`, `PetscRandomRegisterDestroy()`
1405c6c1daeSBarry Smith @*/
141*9371c9d4SSatish Balay PetscErrorCode PetscRandomRegisterAll(void) {
1425c6c1daeSBarry Smith   PetscFunctionBegin;
1430f51fdf8SToby Isaac   if (PetscRandomRegisterAllCalled) PetscFunctionReturn(0);
1445c6c1daeSBarry Smith   PetscRandomRegisterAllCalled = PETSC_TRUE;
1455c6c1daeSBarry Smith #if defined(PETSC_HAVE_RAND)
1469566063dSJacob Faibussowitsch   PetscCall(PetscRandomRegister(PETSCRAND, PetscRandomCreate_Rand));
1475c6c1daeSBarry Smith #endif
1485c6c1daeSBarry Smith #if defined(PETSC_HAVE_DRAND48)
1499566063dSJacob Faibussowitsch   PetscCall(PetscRandomRegister(PETSCRAND48, PetscRandomCreate_Rand48));
1505c6c1daeSBarry Smith #endif
1515c6c1daeSBarry Smith #if defined(PETSC_HAVE_SPRNG)
1529566063dSJacob Faibussowitsch   PetscCall(PetscRandomRegister(PETSCSPRNG, PetscRandomCreate_Sprng));
1535c6c1daeSBarry Smith #endif
1549566063dSJacob Faibussowitsch   PetscCall(PetscRandomRegister(PETSCRANDER48, PetscRandomCreate_Rander48));
15525ccb61fSToby Isaac #if defined(PETSC_HAVE_RANDOM123)
1569566063dSJacob Faibussowitsch   PetscCall(PetscRandomRegister(PETSCRANDOM123, PetscRandomCreate_Random123));
15725ccb61fSToby Isaac #endif
158808ba619SStefano Zampini #if defined(PETSC_HAVE_CUDA)
1599566063dSJacob Faibussowitsch   PetscCall(PetscRandomRegister(PETSCCURAND, PetscRandomCreate_CURAND));
160808ba619SStefano Zampini #endif
1615c6c1daeSBarry Smith   PetscFunctionReturn(0);
1625c6c1daeSBarry Smith }
163