1 2 #include <../src/sys/classes/random/randomimpl.h> /*I "petscsys.h" I*/ 3 4 PetscFunctionList PetscRandomList = NULL; 5 PetscBool PetscRandomRegisterAllCalled = PETSC_FALSE; 6 7 /*@C 8 PetscRandomSetType - Builds a context for generating particular type of random numbers. 9 10 Collective on PetscRandom 11 12 Input Parameters: 13 + rnd - The random number generator context 14 - type - The name of the random type 15 16 Options Database Key: 17 . -random_type <type> - Sets the random type; use -help for a list 18 of available types 19 20 Notes: 21 See "petsc/include/petscsys.h" for available random types (for instance, PETSCRAND48, PETSCRAND). 22 23 Level: intermediate 24 25 .keywords: random, set, type 26 .seealso: PetscRandomGetType(), PetscRandomCreate() 27 @*/ 28 29 PetscErrorCode PetscRandomSetType(PetscRandom rnd, PetscRandomType type) 30 { 31 PetscErrorCode (*r)(PetscRandom); 32 PetscBool match; 33 PetscErrorCode ierr; 34 35 PetscFunctionBegin; 36 PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID,1); 37 ierr = PetscObjectTypeCompare((PetscObject)rnd, type, &match);CHKERRQ(ierr); 38 if (match) PetscFunctionReturn(0); 39 40 ierr = PetscFunctionListFind(PetscRandomList,type,&r);CHKERRQ(ierr); 41 if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown random type: %s", type); 42 43 if (rnd->ops->destroy) { 44 ierr = (*rnd->ops->destroy)(rnd);CHKERRQ(ierr); 45 46 rnd->ops->destroy = NULL; 47 } 48 ierr = (*r)(rnd);CHKERRQ(ierr); 49 ierr = PetscRandomSeed(rnd);CHKERRQ(ierr); 50 51 ierr = PetscObjectChangeTypeName((PetscObject)rnd, type);CHKERRQ(ierr); 52 PetscFunctionReturn(0); 53 } 54 55 /*@C 56 PetscRandomGetType - Gets the type name (as a string) from the PetscRandom. 57 58 Not Collective 59 60 Input Parameter: 61 . rnd - The random number generator context 62 63 Output Parameter: 64 . type - The type name 65 66 Level: intermediate 67 68 .keywords: random, get, type, name 69 .seealso: PetscRandomSetType(), PetscRandomCreate() 70 @*/ 71 PetscErrorCode PetscRandomGetType(PetscRandom rnd, PetscRandomType *type) 72 { 73 PetscFunctionBegin; 74 PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID,1); 75 PetscValidPointer(type,2); 76 *type = ((PetscObject)rnd)->type_name; 77 PetscFunctionReturn(0); 78 } 79 80 /*@C 81 PetscRandomRegister - Adds a new PetscRandom component implementation 82 83 Not Collective 84 85 Input Parameters: 86 + name - The name of a new user-defined creation routine 87 - create_func - The creation routine itself 88 89 Notes: 90 PetscRandomRegister() may be called multiple times to add several user-defined randome number generators 91 92 Sample usage: 93 .vb 94 PetscRandomRegister("my_rand", MyPetscRandomtorCreate); 95 .ve 96 97 Then, your random type can be chosen with the procedural interface via 98 .vb 99 PetscRandomCreate(MPI_Comm, PetscRandom *); 100 PetscRandomSetType(PetscRandom,"my_random_name"); 101 .ve 102 or at runtime via the option 103 .vb 104 -random_type my_random_name 105 .ve 106 107 Notes: 108 For an example of the code needed to interface your own random number generator see 109 src/sys/random/impls/rand/rand.c 110 111 Level: advanced 112 113 .keywords: PetscRandom, register 114 115 .seealso: PetscRandomRegisterAll(), PetscRandomRegisterDestroy(), PetscRandomRegister() 116 @*/ 117 PetscErrorCode PetscRandomRegister(const char sname[], PetscErrorCode (*function)(PetscRandom)) 118 { 119 PetscErrorCode ierr; 120 121 PetscFunctionBegin; 122 ierr = PetscFunctionListAdd(&PetscRandomList,sname,function);CHKERRQ(ierr); 123 PetscFunctionReturn(0); 124 } 125 126 #if defined(PETSC_HAVE_RAND) 127 PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom); 128 #endif 129 #if defined(PETSC_HAVE_DRAND48) 130 PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand48(PetscRandom); 131 #endif 132 #if defined(PETSC_HAVE_SPRNG) 133 PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom); 134 #endif 135 PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rander48(PetscRandom); 136 #if defined(PETSC_HAVE_RANDOM123) 137 PETSC_EXTERN PetscErrorCode PetscRandomCreate_Random123(PetscRandom); 138 #endif 139 140 /*@C 141 PetscRandomRegisterAll - Registers all of the components in the PetscRandom package. 142 143 Not Collective 144 145 Level: advanced 146 147 .keywords: PetscRandom, register, all 148 .seealso: PetscRandomRegister(), PetscRandomRegisterDestroy() 149 @*/ 150 PetscErrorCode PetscRandomRegisterAll(void) 151 { 152 PetscErrorCode ierr; 153 154 PetscFunctionBegin; 155 if (PetscRandomRegisterAllCalled) PetscFunctionReturn(0); 156 PetscRandomRegisterAllCalled = PETSC_TRUE; 157 #if defined(PETSC_HAVE_RAND) 158 ierr = PetscRandomRegister(PETSCRAND, PetscRandomCreate_Rand);CHKERRQ(ierr); 159 #endif 160 #if defined(PETSC_HAVE_DRAND48) 161 ierr = PetscRandomRegister(PETSCRAND48,PetscRandomCreate_Rand48);CHKERRQ(ierr); 162 #endif 163 #if defined(PETSC_HAVE_SPRNG) 164 ierr = PetscRandomRegister(PETSCSPRNG, PetscRandomCreate_Sprng);CHKERRQ(ierr); 165 #endif 166 ierr = PetscRandomRegister(PETSCRANDER48,PetscRandomCreate_Rander48);CHKERRQ(ierr); 167 #if defined(PETSC_HAVE_RANDOM123) 168 ierr = PetscRandomRegister(PETSCRANDOM123, PetscRandomCreate_Random123);CHKERRQ(ierr); 169 #endif 170 PetscFunctionReturn(0); 171 } 172 173