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: For an example of the code needed to interface your own random number generator see 108 src/sys/random/impls/rand/rand.c 109 110 Level: advanced 111 112 .keywords: PetscRandom, register 113 114 .seealso: PetscRandomRegisterAll(), PetscRandomRegisterDestroy(), PetscRandomRegister() 115 @*/ 116 PetscErrorCode PetscRandomRegister(const char sname[], PetscErrorCode (*function)(PetscRandom)) 117 { 118 PetscErrorCode ierr; 119 120 PetscFunctionBegin; 121 ierr = PetscFunctionListAdd(&PetscRandomList,sname,function);CHKERRQ(ierr); 122 PetscFunctionReturn(0); 123 } 124 125 #if defined(PETSC_HAVE_RAND) 126 PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom); 127 #endif 128 #if defined(PETSC_HAVE_DRAND48) 129 PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand48(PetscRandom); 130 #endif 131 #if defined(PETSC_HAVE_SPRNG) 132 PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom); 133 #endif 134 PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rander48(PetscRandom); 135 #if defined(PETSC_HAVE_RANDOM123) 136 PETSC_EXTERN PetscErrorCode PetscRandomCreate_Random123(PetscRandom); 137 #endif 138 139 /*@C 140 PetscRandomRegisterAll - Registers all of the components in the PetscRandom package. 141 142 Not Collective 143 144 Level: advanced 145 146 .keywords: PetscRandom, register, all 147 .seealso: PetscRandomRegister(), PetscRandomRegisterDestroy() 148 @*/ 149 PetscErrorCode PetscRandomRegisterAll(void) 150 { 151 PetscErrorCode ierr; 152 153 PetscFunctionBegin; 154 if (PetscRandomRegisterAllCalled) PetscFunctionReturn(0); 155 PetscRandomRegisterAllCalled = PETSC_TRUE; 156 #if defined(PETSC_HAVE_RAND) 157 ierr = PetscRandomRegister(PETSCRAND, PetscRandomCreate_Rand);CHKERRQ(ierr); 158 #endif 159 #if defined(PETSC_HAVE_DRAND48) 160 ierr = PetscRandomRegister(PETSCRAND48,PetscRandomCreate_Rand48);CHKERRQ(ierr); 161 #endif 162 #if defined(PETSC_HAVE_SPRNG) 163 ierr = PetscRandomRegister(PETSCSPRNG, PetscRandomCreate_Sprng);CHKERRQ(ierr); 164 #endif 165 ierr = PetscRandomRegister(PETSCRANDER48,PetscRandomCreate_Rander48);CHKERRQ(ierr); 166 #if defined(PETSC_HAVE_RANDOM123) 167 ierr = PetscRandomRegister(PETSCRANDOM123, PetscRandomCreate_Random123);CHKERRQ(ierr); 168 #endif 169 PetscFunctionReturn(0); 170 } 171 172