1*5c6c1daeSBarry Smith 2*5c6c1daeSBarry Smith #include <../src/sys/classes/random/randomimpl.h> /*I "petscsys.h" I*/ 3*5c6c1daeSBarry Smith 4*5c6c1daeSBarry Smith PetscFList PetscRandomList = PETSC_NULL; 5*5c6c1daeSBarry Smith PetscBool PetscRandomRegisterAllCalled = PETSC_FALSE; 6*5c6c1daeSBarry Smith 7*5c6c1daeSBarry Smith #undef __FUNCT__ 8*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomSetType" 9*5c6c1daeSBarry Smith /*@C 10*5c6c1daeSBarry Smith PetscRandomSetType - Builds a context for generating particular type of random numbers. 11*5c6c1daeSBarry Smith 12*5c6c1daeSBarry Smith Collective on PetscRandom 13*5c6c1daeSBarry Smith 14*5c6c1daeSBarry Smith Input Parameters: 15*5c6c1daeSBarry Smith + rnd - The random number generator context 16*5c6c1daeSBarry Smith - type - The name of the random type 17*5c6c1daeSBarry Smith 18*5c6c1daeSBarry Smith Options Database Key: 19*5c6c1daeSBarry Smith . -random_type <type> - Sets the random type; use -help for a list 20*5c6c1daeSBarry Smith of available types 21*5c6c1daeSBarry Smith 22*5c6c1daeSBarry Smith Notes: 23*5c6c1daeSBarry Smith See "petsc/include/petscsys.h" for available random types (for instance, PETSCRAND48, PETSCRAND). 24*5c6c1daeSBarry Smith 25*5c6c1daeSBarry Smith Level: intermediate 26*5c6c1daeSBarry Smith 27*5c6c1daeSBarry Smith .keywords: random, set, type 28*5c6c1daeSBarry Smith .seealso: PetscRandomGetType(), PetscRandomCreate() 29*5c6c1daeSBarry Smith @*/ 30*5c6c1daeSBarry Smith 31*5c6c1daeSBarry Smith PetscErrorCode PetscRandomSetType(PetscRandom rnd, PetscRandomType type) 32*5c6c1daeSBarry Smith { 33*5c6c1daeSBarry Smith PetscErrorCode (*r)(PetscRandom); 34*5c6c1daeSBarry Smith PetscBool match; 35*5c6c1daeSBarry Smith PetscErrorCode ierr; 36*5c6c1daeSBarry Smith 37*5c6c1daeSBarry Smith PetscFunctionBegin; 38*5c6c1daeSBarry Smith PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID,1); 39*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)rnd, type, &match);CHKERRQ(ierr); 40*5c6c1daeSBarry Smith if (match) PetscFunctionReturn(0); 41*5c6c1daeSBarry Smith 42*5c6c1daeSBarry Smith ierr = PetscFListFind(PetscRandomList,((PetscObject)rnd)->comm, type,PETSC_TRUE,(void (**)(void)) &r);CHKERRQ(ierr); 43*5c6c1daeSBarry Smith if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown random type: %s", type); 44*5c6c1daeSBarry Smith 45*5c6c1daeSBarry Smith if (rnd->ops->destroy) { 46*5c6c1daeSBarry Smith ierr = (*rnd->ops->destroy)(rnd);CHKERRQ(ierr); 47*5c6c1daeSBarry Smith rnd->ops->destroy = PETSC_NULL; 48*5c6c1daeSBarry Smith } 49*5c6c1daeSBarry Smith ierr = (*r)(rnd);CHKERRQ(ierr); 50*5c6c1daeSBarry Smith ierr = PetscRandomSeed(rnd);CHKERRQ(ierr); 51*5c6c1daeSBarry Smith 52*5c6c1daeSBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)rnd, type);CHKERRQ(ierr); 53*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_AMS) 54*5c6c1daeSBarry Smith if (PetscAMSPublishAll) { 55*5c6c1daeSBarry Smith ierr = PetscObjectAMSPublish((PetscObject)rnd);CHKERRQ(ierr); 56*5c6c1daeSBarry Smith } 57*5c6c1daeSBarry Smith #endif 58*5c6c1daeSBarry Smith PetscFunctionReturn(0); 59*5c6c1daeSBarry Smith } 60*5c6c1daeSBarry Smith 61*5c6c1daeSBarry Smith #undef __FUNCT__ 62*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomGetType" 63*5c6c1daeSBarry Smith /*@C 64*5c6c1daeSBarry Smith PetscRandomGetType - Gets the type name (as a string) from the PetscRandom. 65*5c6c1daeSBarry Smith 66*5c6c1daeSBarry Smith Not Collective 67*5c6c1daeSBarry Smith 68*5c6c1daeSBarry Smith Input Parameter: 69*5c6c1daeSBarry Smith . rnd - The random number generator context 70*5c6c1daeSBarry Smith 71*5c6c1daeSBarry Smith Output Parameter: 72*5c6c1daeSBarry Smith . type - The type name 73*5c6c1daeSBarry Smith 74*5c6c1daeSBarry Smith Level: intermediate 75*5c6c1daeSBarry Smith 76*5c6c1daeSBarry Smith .keywords: random, get, type, name 77*5c6c1daeSBarry Smith .seealso: PetscRandomSetType(), PetscRandomCreate() 78*5c6c1daeSBarry Smith @*/ 79*5c6c1daeSBarry Smith PetscErrorCode PetscRandomGetType(PetscRandom rnd, PetscRandomType *type) 80*5c6c1daeSBarry Smith { 81*5c6c1daeSBarry Smith PetscFunctionBegin; 82*5c6c1daeSBarry Smith PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID,1); 83*5c6c1daeSBarry Smith PetscValidPointer(type,2); 84*5c6c1daeSBarry Smith *type = ((PetscObject)rnd)->type_name; 85*5c6c1daeSBarry Smith PetscFunctionReturn(0); 86*5c6c1daeSBarry Smith } 87*5c6c1daeSBarry Smith 88*5c6c1daeSBarry Smith #undef __FUNCT__ 89*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomRegister" 90*5c6c1daeSBarry Smith /*@C 91*5c6c1daeSBarry Smith PetscRandomRegister - See PetscRandomRegisterDynamic() 92*5c6c1daeSBarry Smith 93*5c6c1daeSBarry Smith Level: advanced 94*5c6c1daeSBarry Smith @*/ 95*5c6c1daeSBarry Smith PetscErrorCode PetscRandomRegister(const char sname[], const char path[], const char name[], PetscErrorCode (*function)(PetscRandom)) 96*5c6c1daeSBarry Smith { 97*5c6c1daeSBarry Smith char fullname[PETSC_MAX_PATH_LEN]; 98*5c6c1daeSBarry Smith PetscErrorCode ierr; 99*5c6c1daeSBarry Smith 100*5c6c1daeSBarry Smith PetscFunctionBegin; 101*5c6c1daeSBarry Smith ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr); 102*5c6c1daeSBarry Smith ierr = PetscFListAdd(&PetscRandomList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr); 103*5c6c1daeSBarry Smith PetscFunctionReturn(0); 104*5c6c1daeSBarry Smith } 105*5c6c1daeSBarry Smith 106*5c6c1daeSBarry Smith 107*5c6c1daeSBarry Smith /*--------------------------------------------------------------------------------------------------------------------*/ 108*5c6c1daeSBarry Smith #undef __FUNCT__ 109*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomRegisterDestroy" 110*5c6c1daeSBarry Smith /*@C 111*5c6c1daeSBarry Smith PetscRandomRegisterDestroy - Frees the list of Random types that were registered by PetscRandomRegister()/PetscRandomRegisterDynamic(). 112*5c6c1daeSBarry Smith 113*5c6c1daeSBarry Smith Not Collective 114*5c6c1daeSBarry Smith 115*5c6c1daeSBarry Smith Level: advanced 116*5c6c1daeSBarry Smith 117*5c6c1daeSBarry Smith .keywords: PetscRandom, register, destroy 118*5c6c1daeSBarry Smith .seealso: PetscRandomRegister(), PetscRandomRegisterAll(), PetscRandomRegisterDynamic() 119*5c6c1daeSBarry Smith @*/ 120*5c6c1daeSBarry Smith PetscErrorCode PetscRandomRegisterDestroy(void) 121*5c6c1daeSBarry Smith { 122*5c6c1daeSBarry Smith PetscErrorCode ierr; 123*5c6c1daeSBarry Smith 124*5c6c1daeSBarry Smith PetscFunctionBegin; 125*5c6c1daeSBarry Smith ierr = PetscFListDestroy(&PetscRandomList);CHKERRQ(ierr); 126*5c6c1daeSBarry Smith PetscRandomRegisterAllCalled = PETSC_FALSE; 127*5c6c1daeSBarry Smith PetscFunctionReturn(0); 128*5c6c1daeSBarry Smith } 129*5c6c1daeSBarry Smith 130*5c6c1daeSBarry Smith EXTERN_C_BEGIN 131*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_RAND) 132*5c6c1daeSBarry Smith extern PetscErrorCode PetscRandomCreate_Rand(PetscRandom); 133*5c6c1daeSBarry Smith #endif 134*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_DRAND48) 135*5c6c1daeSBarry Smith extern PetscErrorCode PetscRandomCreate_Rand48(PetscRandom); 136*5c6c1daeSBarry Smith #endif 137*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_SPRNG) 138*5c6c1daeSBarry Smith extern PetscErrorCode PetscRandomCreate_Sprng(PetscRandom); 139*5c6c1daeSBarry Smith #endif 140*5c6c1daeSBarry Smith EXTERN_C_END 141*5c6c1daeSBarry Smith 142*5c6c1daeSBarry Smith #undef __FUNCT__ 143*5c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomRegisterAll" 144*5c6c1daeSBarry Smith /*@C 145*5c6c1daeSBarry Smith PetscRandomRegisterAll - Registers all of the components in the PetscRandom package. 146*5c6c1daeSBarry Smith 147*5c6c1daeSBarry Smith Not Collective 148*5c6c1daeSBarry Smith 149*5c6c1daeSBarry Smith Input parameter: 150*5c6c1daeSBarry Smith . path - The dynamic library path 151*5c6c1daeSBarry Smith 152*5c6c1daeSBarry Smith Level: advanced 153*5c6c1daeSBarry Smith 154*5c6c1daeSBarry Smith .keywords: PetscRandom, register, all 155*5c6c1daeSBarry Smith .seealso: PetscRandomRegister(), PetscRandomRegisterDestroy(), PetscRandomRegisterDynamic() 156*5c6c1daeSBarry Smith @*/ 157*5c6c1daeSBarry Smith PetscErrorCode PetscRandomRegisterAll(const char path[]) 158*5c6c1daeSBarry Smith { 159*5c6c1daeSBarry Smith PetscErrorCode ierr; 160*5c6c1daeSBarry Smith 161*5c6c1daeSBarry Smith PetscFunctionBegin; 162*5c6c1daeSBarry Smith PetscRandomRegisterAllCalled = PETSC_TRUE; 163*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_RAND) 164*5c6c1daeSBarry Smith ierr = PetscRandomRegisterDynamic(PETSCRAND, path,"PetscRandomCreate_Rand", PetscRandomCreate_Rand);CHKERRQ(ierr); 165*5c6c1daeSBarry Smith #endif 166*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_DRAND48) 167*5c6c1daeSBarry Smith ierr = PetscRandomRegisterDynamic(PETSCRAND48,path,"PetscRandomCreate_Rand48",PetscRandomCreate_Rand48);CHKERRQ(ierr); 168*5c6c1daeSBarry Smith #endif 169*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_SPRNG) 170*5c6c1daeSBarry Smith ierr = PetscRandomRegisterDynamic(PETSCSPRNG,path,"PetscRandomCreate_Sprng",PetscRandomCreate_Sprng);CHKERRQ(ierr); 171*5c6c1daeSBarry Smith #endif 172*5c6c1daeSBarry Smith PetscFunctionReturn(0); 173*5c6c1daeSBarry Smith } 174*5c6c1daeSBarry Smith 175