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 @*/ 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 @*/ 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 @*/ 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 @*/ 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