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 255c6c1daeSBarry Smith .seealso: PetscRandomGetType(), PetscRandomCreate() 265c6c1daeSBarry Smith @*/ 275c6c1daeSBarry Smith 285c6c1daeSBarry Smith PetscErrorCode PetscRandomSetType(PetscRandom rnd, PetscRandomType type) 295c6c1daeSBarry Smith { 305c6c1daeSBarry Smith PetscErrorCode (*r)(PetscRandom); 315c6c1daeSBarry Smith PetscBool match; 325c6c1daeSBarry Smith PetscErrorCode ierr; 335c6c1daeSBarry Smith 345c6c1daeSBarry Smith PetscFunctionBegin; 355c6c1daeSBarry Smith PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID,1); 365c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)rnd, type, &match);CHKERRQ(ierr); 375c6c1daeSBarry Smith if (match) PetscFunctionReturn(0); 385c6c1daeSBarry Smith 391c9cd337SJed Brown ierr = PetscFunctionListFind(PetscRandomList,type,&r);CHKERRQ(ierr); 40*2c71b3e2SJacob Faibussowitsch PetscCheckFalse(!r,PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown random type: %s", type); 415c6c1daeSBarry Smith 425c6c1daeSBarry Smith if (rnd->ops->destroy) { 435c6c1daeSBarry Smith ierr = (*rnd->ops->destroy)(rnd);CHKERRQ(ierr); 44a297a907SKarl Rupp 450298fd71SBarry Smith rnd->ops->destroy = NULL; 465c6c1daeSBarry Smith } 475c6c1daeSBarry Smith ierr = (*r)(rnd);CHKERRQ(ierr); 485c6c1daeSBarry Smith ierr = PetscRandomSeed(rnd);CHKERRQ(ierr); 495c6c1daeSBarry Smith 505c6c1daeSBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)rnd, type);CHKERRQ(ierr); 515c6c1daeSBarry Smith PetscFunctionReturn(0); 525c6c1daeSBarry Smith } 535c6c1daeSBarry Smith 545c6c1daeSBarry Smith /*@C 555c6c1daeSBarry Smith PetscRandomGetType - Gets the type name (as a string) from the PetscRandom. 565c6c1daeSBarry Smith 575c6c1daeSBarry Smith Not Collective 585c6c1daeSBarry Smith 595c6c1daeSBarry Smith Input Parameter: 605c6c1daeSBarry Smith . rnd - The random number generator context 615c6c1daeSBarry Smith 625c6c1daeSBarry Smith Output Parameter: 635c6c1daeSBarry Smith . type - The type name 645c6c1daeSBarry Smith 655c6c1daeSBarry Smith Level: intermediate 665c6c1daeSBarry Smith 675c6c1daeSBarry Smith .seealso: PetscRandomSetType(), PetscRandomCreate() 685c6c1daeSBarry Smith @*/ 695c6c1daeSBarry Smith PetscErrorCode PetscRandomGetType(PetscRandom rnd, PetscRandomType *type) 705c6c1daeSBarry Smith { 715c6c1daeSBarry Smith PetscFunctionBegin; 725c6c1daeSBarry Smith PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID,1); 735c6c1daeSBarry Smith PetscValidPointer(type,2); 745c6c1daeSBarry Smith *type = ((PetscObject)rnd)->type_name; 755c6c1daeSBarry Smith PetscFunctionReturn(0); 765c6c1daeSBarry Smith } 775c6c1daeSBarry Smith 785c6c1daeSBarry Smith /*@C 791c84c290SBarry Smith PetscRandomRegister - Adds a new PetscRandom component implementation 801c84c290SBarry Smith 811c84c290SBarry Smith Not Collective 821c84c290SBarry Smith 831c84c290SBarry Smith Input Parameters: 841c84c290SBarry Smith + name - The name of a new user-defined creation routine 851c84c290SBarry Smith - create_func - The creation routine itself 861c84c290SBarry Smith 871c84c290SBarry Smith Notes: 881c84c290SBarry Smith PetscRandomRegister() may be called multiple times to add several user-defined randome number generators 891c84c290SBarry Smith 901c84c290SBarry Smith Sample usage: 911c84c290SBarry Smith .vb 92bdf89e91SBarry Smith PetscRandomRegister("my_rand", MyPetscRandomtorCreate); 931c84c290SBarry Smith .ve 941c84c290SBarry Smith 951c84c290SBarry Smith Then, your random type can be chosen with the procedural interface via 961c84c290SBarry Smith .vb 971c84c290SBarry Smith PetscRandomCreate(MPI_Comm, PetscRandom *); 981c84c290SBarry Smith PetscRandomSetType(PetscRandom,"my_random_name"); 991c84c290SBarry Smith .ve 1001c84c290SBarry Smith or at runtime via the option 1011c84c290SBarry Smith .vb 1021c84c290SBarry Smith -random_type my_random_name 1031c84c290SBarry Smith .ve 1041c84c290SBarry Smith 10595452b02SPatrick Sanan Notes: 10695452b02SPatrick Sanan For an example of the code needed to interface your own random number generator see 1071c84c290SBarry Smith src/sys/random/impls/rand/rand.c 1085c6c1daeSBarry Smith 1095c6c1daeSBarry Smith Level: advanced 1101c84c290SBarry Smith 1111c84c290SBarry Smith .seealso: PetscRandomRegisterAll(), PetscRandomRegisterDestroy(), PetscRandomRegister() 1125c6c1daeSBarry Smith @*/ 113bdf89e91SBarry Smith PetscErrorCode PetscRandomRegister(const char sname[], PetscErrorCode (*function)(PetscRandom)) 1145c6c1daeSBarry Smith { 1155c6c1daeSBarry Smith PetscErrorCode ierr; 1165c6c1daeSBarry Smith 1175c6c1daeSBarry Smith PetscFunctionBegin; 1181d36bdfdSBarry Smith ierr = PetscRandomInitializePackage();CHKERRQ(ierr); 119a240a19fSJed Brown ierr = PetscFunctionListAdd(&PetscRandomList,sname,function);CHKERRQ(ierr); 1205c6c1daeSBarry Smith PetscFunctionReturn(0); 1215c6c1daeSBarry Smith } 1225c6c1daeSBarry Smith 1235c6c1daeSBarry Smith #if defined(PETSC_HAVE_RAND) 1248cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom); 1255c6c1daeSBarry Smith #endif 1265c6c1daeSBarry Smith #if defined(PETSC_HAVE_DRAND48) 1278cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand48(PetscRandom); 1285c6c1daeSBarry Smith #endif 1295c6c1daeSBarry Smith #if defined(PETSC_HAVE_SPRNG) 1308cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom); 1315c6c1daeSBarry Smith #endif 132003ee160SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rander48(PetscRandom); 13325ccb61fSToby Isaac #if defined(PETSC_HAVE_RANDOM123) 13425ccb61fSToby Isaac PETSC_EXTERN PetscErrorCode PetscRandomCreate_Random123(PetscRandom); 13525ccb61fSToby Isaac #endif 136808ba619SStefano Zampini #if defined(PETSC_HAVE_CUDA) 137808ba619SStefano Zampini PETSC_EXTERN PetscErrorCode PetscRandomCreate_CURAND(PetscRandom); 138808ba619SStefano Zampini #endif 1395c6c1daeSBarry Smith 1405c6c1daeSBarry Smith /*@C 1415c6c1daeSBarry Smith PetscRandomRegisterAll - Registers all of the components in the PetscRandom package. 1425c6c1daeSBarry Smith 1435c6c1daeSBarry Smith Not Collective 1445c6c1daeSBarry Smith 1455c6c1daeSBarry Smith Level: advanced 1465c6c1daeSBarry Smith 147607a6623SBarry Smith .seealso: PetscRandomRegister(), PetscRandomRegisterDestroy() 1485c6c1daeSBarry Smith @*/ 149607a6623SBarry Smith PetscErrorCode PetscRandomRegisterAll(void) 1505c6c1daeSBarry Smith { 1515c6c1daeSBarry Smith PetscErrorCode ierr; 1525c6c1daeSBarry Smith 1535c6c1daeSBarry Smith PetscFunctionBegin; 1540f51fdf8SToby Isaac if (PetscRandomRegisterAllCalled) PetscFunctionReturn(0); 1555c6c1daeSBarry Smith PetscRandomRegisterAllCalled = PETSC_TRUE; 1565c6c1daeSBarry Smith #if defined(PETSC_HAVE_RAND) 157bdf89e91SBarry Smith ierr = PetscRandomRegister(PETSCRAND,PetscRandomCreate_Rand);CHKERRQ(ierr); 1585c6c1daeSBarry Smith #endif 1595c6c1daeSBarry Smith #if defined(PETSC_HAVE_DRAND48) 160bdf89e91SBarry Smith ierr = PetscRandomRegister(PETSCRAND48,PetscRandomCreate_Rand48);CHKERRQ(ierr); 1615c6c1daeSBarry Smith #endif 1625c6c1daeSBarry Smith #if defined(PETSC_HAVE_SPRNG) 163bdf89e91SBarry Smith ierr = PetscRandomRegister(PETSCSPRNG,PetscRandomCreate_Sprng);CHKERRQ(ierr); 1645c6c1daeSBarry Smith #endif 165003ee160SMatthew G. Knepley ierr = PetscRandomRegister(PETSCRANDER48,PetscRandomCreate_Rander48);CHKERRQ(ierr); 16625ccb61fSToby Isaac #if defined(PETSC_HAVE_RANDOM123) 16725ccb61fSToby Isaac ierr = PetscRandomRegister(PETSCRANDOM123,PetscRandomCreate_Random123);CHKERRQ(ierr); 16825ccb61fSToby Isaac #endif 169808ba619SStefano Zampini #if defined(PETSC_HAVE_CUDA) 170808ba619SStefano Zampini ierr = PetscRandomRegister(PETSCCURAND,PetscRandomCreate_CURAND);CHKERRQ(ierr); 171808ba619SStefano Zampini #endif 1725c6c1daeSBarry Smith PetscFunctionReturn(0); 1735c6c1daeSBarry Smith } 1745c6c1daeSBarry Smith 175