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 8*811af0c4SBarry Smith PetscRandomSetType - Builds a context for generating a particular type of random numbers. 95c6c1daeSBarry Smith 10*811af0c4SBarry Smith Collective on rnd 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 20*811af0c4SBarry Smith Note: 21*811af0c4SBarry Smith See "petsc/include/petscsys.h" for available random types (for instance, `PETSCRAND48`, `PETSCRAND`). 225c6c1daeSBarry Smith 235c6c1daeSBarry Smith Level: intermediate 245c6c1daeSBarry Smith 25*811af0c4SBarry Smith .seealso: `PetscRandom`, `PetscRandomGetType()`, `PetscRandomCreate()` 265c6c1daeSBarry Smith @*/ 275c6c1daeSBarry Smith 289371c9d4SSatish 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 51*811af0c4SBarry 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 63*811af0c4SBarry Smith .seealso: `PetscRandom`, `PetscRandomSetType()`, `PetscRandomCreate()` 645c6c1daeSBarry Smith @*/ 659371c9d4SSatish 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 74*811af0c4SBarry Smith PetscRandomRegister - Adds a new `PetscRandom` 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: 83*811af0c4SBarry Smith `PetscRandomRegister()` may be called multiple times to add several user-defined randome number generators 84*811af0c4SBarry Smith 85*811af0c4SBarry Smith For an example of the code needed to interface your own random number generator see src/sys/random/impls/rand/rand.c 861c84c290SBarry Smith 871c84c290SBarry Smith Sample usage: 881c84c290SBarry Smith .vb 89bdf89e91SBarry Smith PetscRandomRegister("my_rand", MyPetscRandomtorCreate); 901c84c290SBarry Smith .ve 911c84c290SBarry Smith 921c84c290SBarry Smith Then, your random type can be chosen with the procedural interface via 931c84c290SBarry Smith .vb 941c84c290SBarry Smith PetscRandomCreate(MPI_Comm, PetscRandom *); 951c84c290SBarry Smith PetscRandomSetType(PetscRandom,"my_random_name"); 961c84c290SBarry Smith .ve 971c84c290SBarry Smith or at runtime via the option 981c84c290SBarry Smith .vb 991c84c290SBarry Smith -random_type my_random_name 1001c84c290SBarry Smith .ve 1011c84c290SBarry Smith 1025c6c1daeSBarry Smith Level: advanced 1031c84c290SBarry Smith 104*811af0c4SBarry Smith .seealso: `PetscRandom`, `PetscRandomRegisterAll()`, `PetscRandomRegisterDestroy()`, `PetscRandomRegister()` 1055c6c1daeSBarry Smith @*/ 1069371c9d4SSatish Balay PetscErrorCode PetscRandomRegister(const char sname[], PetscErrorCode (*function)(PetscRandom)) { 1075c6c1daeSBarry Smith PetscFunctionBegin; 1089566063dSJacob Faibussowitsch PetscCall(PetscRandomInitializePackage()); 1099566063dSJacob Faibussowitsch PetscCall(PetscFunctionListAdd(&PetscRandomList, sname, function)); 1105c6c1daeSBarry Smith PetscFunctionReturn(0); 1115c6c1daeSBarry Smith } 1125c6c1daeSBarry Smith 1135c6c1daeSBarry Smith #if defined(PETSC_HAVE_RAND) 1148cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom); 1155c6c1daeSBarry Smith #endif 1165c6c1daeSBarry Smith #if defined(PETSC_HAVE_DRAND48) 1178cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand48(PetscRandom); 1185c6c1daeSBarry Smith #endif 1195c6c1daeSBarry Smith #if defined(PETSC_HAVE_SPRNG) 1208cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom); 1215c6c1daeSBarry Smith #endif 122003ee160SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rander48(PetscRandom); 12325ccb61fSToby Isaac #if defined(PETSC_HAVE_RANDOM123) 12425ccb61fSToby Isaac PETSC_EXTERN PetscErrorCode PetscRandomCreate_Random123(PetscRandom); 12525ccb61fSToby Isaac #endif 126808ba619SStefano Zampini #if defined(PETSC_HAVE_CUDA) 127808ba619SStefano Zampini PETSC_EXTERN PetscErrorCode PetscRandomCreate_CURAND(PetscRandom); 128808ba619SStefano Zampini #endif 1295c6c1daeSBarry Smith 1305c6c1daeSBarry Smith /*@C 131*811af0c4SBarry Smith PetscRandomRegisterAll - Registers all of the components in the `PetscRandom` package. 1325c6c1daeSBarry Smith 1335c6c1daeSBarry Smith Not Collective 1345c6c1daeSBarry Smith 1355c6c1daeSBarry Smith Level: advanced 1365c6c1daeSBarry Smith 137*811af0c4SBarry Smith .seealso: `PetscRandom`, `PetscRandomRegister()`, `PetscRandomRegisterDestroy()` 1385c6c1daeSBarry Smith @*/ 1399371c9d4SSatish Balay PetscErrorCode PetscRandomRegisterAll(void) { 1405c6c1daeSBarry Smith PetscFunctionBegin; 1410f51fdf8SToby Isaac if (PetscRandomRegisterAllCalled) PetscFunctionReturn(0); 1425c6c1daeSBarry Smith PetscRandomRegisterAllCalled = PETSC_TRUE; 1435c6c1daeSBarry Smith #if defined(PETSC_HAVE_RAND) 1449566063dSJacob Faibussowitsch PetscCall(PetscRandomRegister(PETSCRAND, PetscRandomCreate_Rand)); 1455c6c1daeSBarry Smith #endif 1465c6c1daeSBarry Smith #if defined(PETSC_HAVE_DRAND48) 1479566063dSJacob Faibussowitsch PetscCall(PetscRandomRegister(PETSCRAND48, PetscRandomCreate_Rand48)); 1485c6c1daeSBarry Smith #endif 1495c6c1daeSBarry Smith #if defined(PETSC_HAVE_SPRNG) 1509566063dSJacob Faibussowitsch PetscCall(PetscRandomRegister(PETSCSPRNG, PetscRandomCreate_Sprng)); 1515c6c1daeSBarry Smith #endif 1529566063dSJacob Faibussowitsch PetscCall(PetscRandomRegister(PETSCRANDER48, PetscRandomCreate_Rander48)); 15325ccb61fSToby Isaac #if defined(PETSC_HAVE_RANDOM123) 1549566063dSJacob Faibussowitsch PetscCall(PetscRandomRegister(PETSCRANDOM123, PetscRandomCreate_Random123)); 15525ccb61fSToby Isaac #endif 156808ba619SStefano Zampini #if defined(PETSC_HAVE_CUDA) 1579566063dSJacob Faibussowitsch PetscCall(PetscRandomRegister(PETSCCURAND, PetscRandomCreate_CURAND)); 158808ba619SStefano Zampini #endif 1595c6c1daeSBarry Smith PetscFunctionReturn(0); 1605c6c1daeSBarry Smith } 161