15c6c1daeSBarry Smith 25c6c1daeSBarry Smith #include <../src/sys/classes/random/randomimpl.h> /*I "petscsys.h" I*/ 35c6c1daeSBarry Smith 4*140e18c1SBarry Smith PetscFunctionList PetscRandomList = PETSC_NULL; 55c6c1daeSBarry Smith PetscBool PetscRandomRegisterAllCalled = PETSC_FALSE; 65c6c1daeSBarry Smith 75c6c1daeSBarry Smith #undef __FUNCT__ 85c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomSetType" 95c6c1daeSBarry Smith /*@C 105c6c1daeSBarry Smith PetscRandomSetType - Builds a context for generating particular type of random numbers. 115c6c1daeSBarry Smith 125c6c1daeSBarry Smith Collective on PetscRandom 135c6c1daeSBarry Smith 145c6c1daeSBarry Smith Input Parameters: 155c6c1daeSBarry Smith + rnd - The random number generator context 165c6c1daeSBarry Smith - type - The name of the random type 175c6c1daeSBarry Smith 185c6c1daeSBarry Smith Options Database Key: 195c6c1daeSBarry Smith . -random_type <type> - Sets the random type; use -help for a list 205c6c1daeSBarry Smith of available types 215c6c1daeSBarry Smith 225c6c1daeSBarry Smith Notes: 235c6c1daeSBarry Smith See "petsc/include/petscsys.h" for available random types (for instance, PETSCRAND48, PETSCRAND). 245c6c1daeSBarry Smith 255c6c1daeSBarry Smith Level: intermediate 265c6c1daeSBarry Smith 275c6c1daeSBarry Smith .keywords: random, set, type 285c6c1daeSBarry Smith .seealso: PetscRandomGetType(), PetscRandomCreate() 295c6c1daeSBarry Smith @*/ 305c6c1daeSBarry Smith 315c6c1daeSBarry Smith PetscErrorCode PetscRandomSetType(PetscRandom rnd, PetscRandomType type) 325c6c1daeSBarry Smith { 335c6c1daeSBarry Smith PetscErrorCode (*r)(PetscRandom); 345c6c1daeSBarry Smith PetscBool match; 355c6c1daeSBarry Smith PetscErrorCode ierr; 365c6c1daeSBarry Smith 375c6c1daeSBarry Smith PetscFunctionBegin; 385c6c1daeSBarry Smith PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID,1); 395c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)rnd, type, &match);CHKERRQ(ierr); 405c6c1daeSBarry Smith if (match) PetscFunctionReturn(0); 415c6c1daeSBarry Smith 42*140e18c1SBarry Smith ierr = PetscFunctionListFind(((PetscObject)rnd)->comm,PetscRandomList, type,PETSC_TRUE,(void (**)(void)) &r);CHKERRQ(ierr); 435c6c1daeSBarry Smith if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown random type: %s", type); 445c6c1daeSBarry Smith 455c6c1daeSBarry Smith if (rnd->ops->destroy) { 465c6c1daeSBarry Smith ierr = (*rnd->ops->destroy)(rnd);CHKERRQ(ierr); 475c6c1daeSBarry Smith rnd->ops->destroy = PETSC_NULL; 485c6c1daeSBarry Smith } 495c6c1daeSBarry Smith ierr = (*r)(rnd);CHKERRQ(ierr); 505c6c1daeSBarry Smith ierr = PetscRandomSeed(rnd);CHKERRQ(ierr); 515c6c1daeSBarry Smith 525c6c1daeSBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)rnd, type);CHKERRQ(ierr); 535c6c1daeSBarry Smith #if defined(PETSC_HAVE_AMS) 545c6c1daeSBarry Smith if (PetscAMSPublishAll) { 555c6c1daeSBarry Smith ierr = PetscObjectAMSPublish((PetscObject)rnd);CHKERRQ(ierr); 565c6c1daeSBarry Smith } 575c6c1daeSBarry Smith #endif 585c6c1daeSBarry Smith PetscFunctionReturn(0); 595c6c1daeSBarry Smith } 605c6c1daeSBarry Smith 615c6c1daeSBarry Smith #undef __FUNCT__ 625c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomGetType" 635c6c1daeSBarry Smith /*@C 645c6c1daeSBarry Smith PetscRandomGetType - Gets the type name (as a string) from the PetscRandom. 655c6c1daeSBarry Smith 665c6c1daeSBarry Smith Not Collective 675c6c1daeSBarry Smith 685c6c1daeSBarry Smith Input Parameter: 695c6c1daeSBarry Smith . rnd - The random number generator context 705c6c1daeSBarry Smith 715c6c1daeSBarry Smith Output Parameter: 725c6c1daeSBarry Smith . type - The type name 735c6c1daeSBarry Smith 745c6c1daeSBarry Smith Level: intermediate 755c6c1daeSBarry Smith 765c6c1daeSBarry Smith .keywords: random, get, type, name 775c6c1daeSBarry Smith .seealso: PetscRandomSetType(), PetscRandomCreate() 785c6c1daeSBarry Smith @*/ 795c6c1daeSBarry Smith PetscErrorCode PetscRandomGetType(PetscRandom rnd, PetscRandomType *type) 805c6c1daeSBarry Smith { 815c6c1daeSBarry Smith PetscFunctionBegin; 825c6c1daeSBarry Smith PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID,1); 835c6c1daeSBarry Smith PetscValidPointer(type,2); 845c6c1daeSBarry Smith *type = ((PetscObject)rnd)->type_name; 855c6c1daeSBarry Smith PetscFunctionReturn(0); 865c6c1daeSBarry Smith } 875c6c1daeSBarry Smith 885c6c1daeSBarry Smith #undef __FUNCT__ 895c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomRegister" 905c6c1daeSBarry Smith /*@C 915c6c1daeSBarry Smith PetscRandomRegister - See PetscRandomRegisterDynamic() 925c6c1daeSBarry Smith 935c6c1daeSBarry Smith Level: advanced 945c6c1daeSBarry Smith @*/ 955c6c1daeSBarry Smith PetscErrorCode PetscRandomRegister(const char sname[], const char path[], const char name[], PetscErrorCode (*function)(PetscRandom)) 965c6c1daeSBarry Smith { 975c6c1daeSBarry Smith char fullname[PETSC_MAX_PATH_LEN]; 985c6c1daeSBarry Smith PetscErrorCode ierr; 995c6c1daeSBarry Smith 1005c6c1daeSBarry Smith PetscFunctionBegin; 101*140e18c1SBarry Smith ierr = PetscFunctionListConcat(path,name,fullname);CHKERRQ(ierr); 102*140e18c1SBarry Smith ierr = PetscFunctionListAdd(PETSC_COMM_WORLD,&PetscRandomList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr); 1035c6c1daeSBarry Smith PetscFunctionReturn(0); 1045c6c1daeSBarry Smith } 1055c6c1daeSBarry Smith 1065c6c1daeSBarry Smith 1075c6c1daeSBarry Smith /*--------------------------------------------------------------------------------------------------------------------*/ 1085c6c1daeSBarry Smith #undef __FUNCT__ 1095c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomRegisterDestroy" 1105c6c1daeSBarry Smith /*@C 1115c6c1daeSBarry Smith PetscRandomRegisterDestroy - Frees the list of Random types that were registered by PetscRandomRegister()/PetscRandomRegisterDynamic(). 1125c6c1daeSBarry Smith 1135c6c1daeSBarry Smith Not Collective 1145c6c1daeSBarry Smith 1155c6c1daeSBarry Smith Level: advanced 1165c6c1daeSBarry Smith 1175c6c1daeSBarry Smith .keywords: PetscRandom, register, destroy 1185c6c1daeSBarry Smith .seealso: PetscRandomRegister(), PetscRandomRegisterAll(), PetscRandomRegisterDynamic() 1195c6c1daeSBarry Smith @*/ 1205c6c1daeSBarry Smith PetscErrorCode PetscRandomRegisterDestroy(void) 1215c6c1daeSBarry Smith { 1225c6c1daeSBarry Smith PetscErrorCode ierr; 1235c6c1daeSBarry Smith 1245c6c1daeSBarry Smith PetscFunctionBegin; 125*140e18c1SBarry Smith ierr = PetscFunctionListDestroy(&PetscRandomList);CHKERRQ(ierr); 1265c6c1daeSBarry Smith PetscRandomRegisterAllCalled = PETSC_FALSE; 1275c6c1daeSBarry Smith PetscFunctionReturn(0); 1285c6c1daeSBarry Smith } 1295c6c1daeSBarry Smith 1305c6c1daeSBarry Smith EXTERN_C_BEGIN 1315c6c1daeSBarry Smith #if defined(PETSC_HAVE_RAND) 1325c6c1daeSBarry Smith extern PetscErrorCode PetscRandomCreate_Rand(PetscRandom); 1335c6c1daeSBarry Smith #endif 1345c6c1daeSBarry Smith #if defined(PETSC_HAVE_DRAND48) 1355c6c1daeSBarry Smith extern PetscErrorCode PetscRandomCreate_Rand48(PetscRandom); 1365c6c1daeSBarry Smith #endif 1375c6c1daeSBarry Smith #if defined(PETSC_HAVE_SPRNG) 1385c6c1daeSBarry Smith extern PetscErrorCode PetscRandomCreate_Sprng(PetscRandom); 1395c6c1daeSBarry Smith #endif 1405c6c1daeSBarry Smith EXTERN_C_END 1415c6c1daeSBarry Smith 1425c6c1daeSBarry Smith #undef __FUNCT__ 1435c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomRegisterAll" 1445c6c1daeSBarry Smith /*@C 1455c6c1daeSBarry Smith PetscRandomRegisterAll - Registers all of the components in the PetscRandom package. 1465c6c1daeSBarry Smith 1475c6c1daeSBarry Smith Not Collective 1485c6c1daeSBarry Smith 1495c6c1daeSBarry Smith Input parameter: 1505c6c1daeSBarry Smith . path - The dynamic library path 1515c6c1daeSBarry Smith 1525c6c1daeSBarry Smith Level: advanced 1535c6c1daeSBarry Smith 1545c6c1daeSBarry Smith .keywords: PetscRandom, register, all 1555c6c1daeSBarry Smith .seealso: PetscRandomRegister(), PetscRandomRegisterDestroy(), PetscRandomRegisterDynamic() 1565c6c1daeSBarry Smith @*/ 1575c6c1daeSBarry Smith PetscErrorCode PetscRandomRegisterAll(const char path[]) 1585c6c1daeSBarry Smith { 1595c6c1daeSBarry Smith PetscErrorCode ierr; 1605c6c1daeSBarry Smith 1615c6c1daeSBarry Smith PetscFunctionBegin; 1625c6c1daeSBarry Smith PetscRandomRegisterAllCalled = PETSC_TRUE; 1635c6c1daeSBarry Smith #if defined(PETSC_HAVE_RAND) 1645c6c1daeSBarry Smith ierr = PetscRandomRegisterDynamic(PETSCRAND, path,"PetscRandomCreate_Rand", PetscRandomCreate_Rand);CHKERRQ(ierr); 1655c6c1daeSBarry Smith #endif 1665c6c1daeSBarry Smith #if defined(PETSC_HAVE_DRAND48) 1675c6c1daeSBarry Smith ierr = PetscRandomRegisterDynamic(PETSCRAND48,path,"PetscRandomCreate_Rand48",PetscRandomCreate_Rand48);CHKERRQ(ierr); 1685c6c1daeSBarry Smith #endif 1695c6c1daeSBarry Smith #if defined(PETSC_HAVE_SPRNG) 1705c6c1daeSBarry Smith ierr = PetscRandomRegisterDynamic(PETSCSPRNG,path,"PetscRandomCreate_Sprng",PetscRandomCreate_Sprng);CHKERRQ(ierr); 1715c6c1daeSBarry Smith #endif 1725c6c1daeSBarry Smith PetscFunctionReturn(0); 1735c6c1daeSBarry Smith } 1745c6c1daeSBarry Smith 175