1d6cc7855SJacob Faibussowitsch #include <petsc/private/randomimpl.h> /*I "petscsys.h" I*/
25c6c1daeSBarry Smith
30298fd71SBarry Smith PetscFunctionList PetscRandomList = NULL;
45c6c1daeSBarry Smith PetscBool PetscRandomRegisterAllCalled = PETSC_FALSE;
55c6c1daeSBarry Smith
6*cc4c1da9SBarry Smith /*@
7811af0c4SBarry Smith PetscRandomSetType - Builds a context for generating a particular type of random numbers.
85c6c1daeSBarry Smith
9c3339decSBarry Smith Collective
105c6c1daeSBarry Smith
115c6c1daeSBarry Smith Input Parameters:
125c6c1daeSBarry Smith + rnd - The random number generator context
135c6c1daeSBarry Smith - type - The name of the random type
145c6c1daeSBarry Smith
155c6c1daeSBarry Smith Options Database Key:
165c6c1daeSBarry Smith . -random_type <type> - Sets the random type; use -help for a list
175c6c1daeSBarry Smith of available types
185c6c1daeSBarry Smith
195c6c1daeSBarry Smith Level: intermediate
205c6c1daeSBarry Smith
212fe279fdSBarry Smith Note:
222fe279fdSBarry Smith See `PetscRandomType` for available random types (for instance, `PETSCRAND48`, `PETSCRAND`).
232fe279fdSBarry Smith
242fe279fdSBarry Smith .seealso: `PetscRandom`, `PetscRandomType`, `PetscRandomGetType()`, `PetscRandomCreate()`
255c6c1daeSBarry Smith @*/
PetscRandomSetType(PetscRandom rnd,PetscRandomType type)26d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomSetType(PetscRandom rnd, PetscRandomType type)
27d71ae5a4SJacob Faibussowitsch {
285c6c1daeSBarry Smith PetscErrorCode (*r)(PetscRandom);
295c6c1daeSBarry Smith PetscBool match;
305c6c1daeSBarry Smith
315c6c1daeSBarry Smith PetscFunctionBegin;
325c6c1daeSBarry Smith PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID, 1);
339566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)rnd, type, &match));
343ba16761SJacob Faibussowitsch if (match) PetscFunctionReturn(PETSC_SUCCESS);
355c6c1daeSBarry Smith
369566063dSJacob Faibussowitsch PetscCall(PetscFunctionListFind(PetscRandomList, type, &r));
376adde796SStefano Zampini PetscCheck(r, PetscObjectComm((PetscObject)rnd), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown random type: %s", type);
385c6c1daeSBarry Smith
39dbbe0bcdSBarry Smith PetscTryTypeMethod(rnd, destroy);
400298fd71SBarry Smith rnd->ops->destroy = NULL;
41dbbe0bcdSBarry Smith
429566063dSJacob Faibussowitsch PetscCall((*r)(rnd));
439566063dSJacob Faibussowitsch PetscCall(PetscRandomSeed(rnd));
445c6c1daeSBarry Smith
459566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)rnd, type));
463ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
475c6c1daeSBarry Smith }
485c6c1daeSBarry Smith
49*cc4c1da9SBarry Smith /*@
50811af0c4SBarry Smith PetscRandomGetType - Gets the type name (as a string) from the `PetscRandom`.
515c6c1daeSBarry Smith
525c6c1daeSBarry Smith Not Collective
535c6c1daeSBarry Smith
545c6c1daeSBarry Smith Input Parameter:
555c6c1daeSBarry Smith . rnd - The random number generator context
565c6c1daeSBarry Smith
575c6c1daeSBarry Smith Output Parameter:
585c6c1daeSBarry Smith . type - The type name
595c6c1daeSBarry Smith
605c6c1daeSBarry Smith Level: intermediate
615c6c1daeSBarry Smith
622fe279fdSBarry Smith .seealso: `PetscRandom`, `PetscRandomType`, `PetscRandomSetType()`, `PetscRandomCreate()`
635c6c1daeSBarry Smith @*/
PetscRandomGetType(PetscRandom rnd,PetscRandomType * type)64d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomGetType(PetscRandom rnd, PetscRandomType *type)
65d71ae5a4SJacob Faibussowitsch {
665c6c1daeSBarry Smith PetscFunctionBegin;
675c6c1daeSBarry Smith PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID, 1);
684f572ea9SToby Isaac PetscAssertPointer(type, 2);
695c6c1daeSBarry Smith *type = ((PetscObject)rnd)->type_name;
703ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
715c6c1daeSBarry Smith }
725c6c1daeSBarry Smith
735c6c1daeSBarry Smith /*@C
74811af0c4SBarry Smith PetscRandomRegister - Adds a new `PetscRandom` implementation
751c84c290SBarry Smith
76*cc4c1da9SBarry Smith Not Collective, No Fortran Support
771c84c290SBarry Smith
781c84c290SBarry Smith Input Parameters:
792fe279fdSBarry Smith + sname - The name of a new user-defined creation routine
802fe279fdSBarry Smith - function - The creation routine
812fe279fdSBarry Smith
822fe279fdSBarry Smith Level: advanced
831c84c290SBarry Smith
841c84c290SBarry Smith Notes:
85f332b1cbSPierre Jolivet `PetscRandomRegister()` may be called multiple times to add several user-defined random number generators
86811af0c4SBarry Smith
87811af0c4SBarry Smith For an example of the code needed to interface your own random number generator see src/sys/random/impls/rand/rand.c
881c84c290SBarry Smith
89aec76313SJacob Faibussowitsch Example Usage:
901c84c290SBarry Smith .vb
91bdf89e91SBarry Smith PetscRandomRegister("my_rand", MyPetscRandomtorCreate);
921c84c290SBarry Smith .ve
931c84c290SBarry Smith
941c84c290SBarry Smith Then, your random type can be chosen with the procedural interface via
951c84c290SBarry Smith .vb
961c84c290SBarry Smith PetscRandomCreate(MPI_Comm, PetscRandom *);
971c84c290SBarry Smith PetscRandomSetType(PetscRandom,"my_random_name");
981c84c290SBarry Smith .ve
991c84c290SBarry Smith or at runtime via the option
1001c84c290SBarry Smith .vb
1011c84c290SBarry Smith -random_type my_random_name
1021c84c290SBarry Smith .ve
1031c84c290SBarry Smith
10442747ad1SJacob Faibussowitsch .seealso: `PetscRandom`, `PetscRandomRegisterAll()`, `PetscRandomRegisterDestroy()`
1055c6c1daeSBarry Smith @*/
PetscRandomRegister(const char sname[],PetscErrorCode (* function)(PetscRandom))106d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomRegister(const char sname[], PetscErrorCode (*function)(PetscRandom))
107d71ae5a4SJacob Faibussowitsch {
1085c6c1daeSBarry Smith PetscFunctionBegin;
1099566063dSJacob Faibussowitsch PetscCall(PetscRandomInitializePackage());
1109566063dSJacob Faibussowitsch PetscCall(PetscFunctionListAdd(&PetscRandomList, sname, function));
1113ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1125c6c1daeSBarry Smith }
1135c6c1daeSBarry Smith
1145c6c1daeSBarry Smith #if defined(PETSC_HAVE_RAND)
1158cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom);
1165c6c1daeSBarry Smith #endif
1175c6c1daeSBarry Smith #if defined(PETSC_HAVE_DRAND48)
1188cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand48(PetscRandom);
1195c6c1daeSBarry Smith #endif
1205c6c1daeSBarry Smith #if defined(PETSC_HAVE_SPRNG)
1218cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom);
1225c6c1daeSBarry Smith #endif
123003ee160SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rander48(PetscRandom);
12425ccb61fSToby Isaac #if defined(PETSC_HAVE_RANDOM123)
12525ccb61fSToby Isaac PETSC_EXTERN PetscErrorCode PetscRandomCreate_Random123(PetscRandom);
12625ccb61fSToby Isaac #endif
127808ba619SStefano Zampini #if defined(PETSC_HAVE_CUDA)
128808ba619SStefano Zampini PETSC_EXTERN PetscErrorCode PetscRandomCreate_CURAND(PetscRandom);
129808ba619SStefano Zampini #endif
1305c6c1daeSBarry Smith
1315c6c1daeSBarry Smith /*@C
1322fe279fdSBarry Smith PetscRandomRegisterAll - Registers all of the implementations in the `PetscRandom` package.
1335c6c1daeSBarry Smith
1345c6c1daeSBarry Smith Not Collective
1355c6c1daeSBarry Smith
1365c6c1daeSBarry Smith Level: advanced
1375c6c1daeSBarry Smith
1382fe279fdSBarry Smith .seealso: `PetscRandom`, `PetscRandomType`, `PetscRandomRegister()`, `PetscRandomRegisterDestroy()`
1395c6c1daeSBarry Smith @*/
PetscRandomRegisterAll(void)140d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomRegisterAll(void)
141d71ae5a4SJacob Faibussowitsch {
1425c6c1daeSBarry Smith PetscFunctionBegin;
1433ba16761SJacob Faibussowitsch if (PetscRandomRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS);
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
1613ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1625c6c1daeSBarry Smith }
163