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 = PetscRandomInitializePackage();CHKERRQ(ierr); 123 ierr = PetscFunctionListAdd(&PetscRandomList,sname,function);CHKERRQ(ierr); 124 PetscFunctionReturn(0); 125 } 126 127 #if defined(PETSC_HAVE_RAND) 128 PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom); 129 #endif 130 #if defined(PETSC_HAVE_DRAND48) 131 PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand48(PetscRandom); 132 #endif 133 #if defined(PETSC_HAVE_SPRNG) 134 PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom); 135 #endif 136 PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rander48(PetscRandom); 137 #if defined(PETSC_HAVE_RANDOM123) 138 PETSC_EXTERN PetscErrorCode PetscRandomCreate_Random123(PetscRandom); 139 #endif 140 141 /*@C 142 PetscRandomRegisterAll - Registers all of the components in the PetscRandom package. 143 144 Not Collective 145 146 Level: advanced 147 148 .keywords: PetscRandom, register, all 149 .seealso: PetscRandomRegister(), PetscRandomRegisterDestroy() 150 @*/ 151 PetscErrorCode PetscRandomRegisterAll(void) 152 { 153 PetscErrorCode ierr; 154 155 PetscFunctionBegin; 156 if (PetscRandomRegisterAllCalled) PetscFunctionReturn(0); 157 PetscRandomRegisterAllCalled = PETSC_TRUE; 158 #if defined(PETSC_HAVE_RAND) 159 ierr = PetscRandomRegister(PETSCRAND, PetscRandomCreate_Rand);CHKERRQ(ierr); 160 #endif 161 #if defined(PETSC_HAVE_DRAND48) 162 ierr = PetscRandomRegister(PETSCRAND48,PetscRandomCreate_Rand48);CHKERRQ(ierr); 163 #endif 164 #if defined(PETSC_HAVE_SPRNG) 165 ierr = PetscRandomRegister(PETSCSPRNG, PetscRandomCreate_Sprng);CHKERRQ(ierr); 166 #endif 167 ierr = PetscRandomRegister(PETSCRANDER48,PetscRandomCreate_Rander48);CHKERRQ(ierr); 168 #if defined(PETSC_HAVE_RANDOM123) 169 ierr = PetscRandomRegister(PETSCRANDOM123, PetscRandomCreate_Random123);CHKERRQ(ierr); 170 #endif 171 PetscFunctionReturn(0); 172 } 173 174