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