1 2 #include <../src/sys/classes/random/randomimpl.h> /*I "petscsys.h" I*/ 3 4 PetscFunctionList 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 = PetscFunctionListFind(((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 48 rnd->ops->destroy = PETSC_NULL; 49 } 50 ierr = (*r)(rnd);CHKERRQ(ierr); 51 ierr = PetscRandomSeed(rnd);CHKERRQ(ierr); 52 53 ierr = PetscObjectChangeTypeName((PetscObject)rnd, type);CHKERRQ(ierr); 54 #if defined(PETSC_HAVE_AMS) 55 if (PetscAMSPublishAll) { 56 ierr = PetscObjectAMSPublish((PetscObject)rnd);CHKERRQ(ierr); 57 } 58 #endif 59 PetscFunctionReturn(0); 60 } 61 62 #undef __FUNCT__ 63 #define __FUNCT__ "PetscRandomGetType" 64 /*@C 65 PetscRandomGetType - Gets the type name (as a string) from the PetscRandom. 66 67 Not Collective 68 69 Input Parameter: 70 . rnd - The random number generator context 71 72 Output Parameter: 73 . type - The type name 74 75 Level: intermediate 76 77 .keywords: random, get, type, name 78 .seealso: PetscRandomSetType(), PetscRandomCreate() 79 @*/ 80 PetscErrorCode PetscRandomGetType(PetscRandom rnd, PetscRandomType *type) 81 { 82 PetscFunctionBegin; 83 PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID,1); 84 PetscValidPointer(type,2); 85 *type = ((PetscObject)rnd)->type_name; 86 PetscFunctionReturn(0); 87 } 88 89 #undef __FUNCT__ 90 #define __FUNCT__ "PetscRandomRegister" 91 /*@C 92 PetscRandomRegister - See PetscRandomRegisterDynamic() 93 94 Level: advanced 95 @*/ 96 PetscErrorCode PetscRandomRegister(const char sname[], const char path[], const char name[], PetscErrorCode (*function)(PetscRandom)) 97 { 98 char fullname[PETSC_MAX_PATH_LEN]; 99 PetscErrorCode ierr; 100 101 PetscFunctionBegin; 102 ierr = PetscFunctionListConcat(path,name,fullname);CHKERRQ(ierr); 103 ierr = PetscFunctionListAdd(PETSC_COMM_WORLD,&PetscRandomList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr); 104 PetscFunctionReturn(0); 105 } 106 107 108 /*--------------------------------------------------------------------------------------------------------------------*/ 109 #undef __FUNCT__ 110 #define __FUNCT__ "PetscRandomRegisterDestroy" 111 /*@C 112 PetscRandomRegisterDestroy - Frees the list of Random types that were registered by PetscRandomRegister()/PetscRandomRegisterDynamic(). 113 114 Not Collective 115 116 Level: advanced 117 118 .keywords: PetscRandom, register, destroy 119 .seealso: PetscRandomRegister(), PetscRandomRegisterAll(), PetscRandomRegisterDynamic() 120 @*/ 121 PetscErrorCode PetscRandomRegisterDestroy(void) 122 { 123 PetscErrorCode ierr; 124 125 PetscFunctionBegin; 126 ierr = PetscFunctionListDestroy(&PetscRandomList);CHKERRQ(ierr); 127 128 PetscRandomRegisterAllCalled = PETSC_FALSE; 129 PetscFunctionReturn(0); 130 } 131 132 EXTERN_C_BEGIN 133 #if defined(PETSC_HAVE_RAND) 134 extern PetscErrorCode PetscRandomCreate_Rand(PetscRandom); 135 #endif 136 #if defined(PETSC_HAVE_DRAND48) 137 extern PetscErrorCode PetscRandomCreate_Rand48(PetscRandom); 138 #endif 139 #if defined(PETSC_HAVE_SPRNG) 140 extern PetscErrorCode PetscRandomCreate_Sprng(PetscRandom); 141 #endif 142 EXTERN_C_END 143 144 #undef __FUNCT__ 145 #define __FUNCT__ "PetscRandomRegisterAll" 146 /*@C 147 PetscRandomRegisterAll - Registers all of the components in the PetscRandom package. 148 149 Not Collective 150 151 Input parameter: 152 . path - The dynamic library path 153 154 Level: advanced 155 156 .keywords: PetscRandom, register, all 157 .seealso: PetscRandomRegister(), PetscRandomRegisterDestroy(), PetscRandomRegisterDynamic() 158 @*/ 159 PetscErrorCode PetscRandomRegisterAll(const char path[]) 160 { 161 PetscErrorCode ierr; 162 163 PetscFunctionBegin; 164 PetscRandomRegisterAllCalled = PETSC_TRUE; 165 #if defined(PETSC_HAVE_RAND) 166 ierr = PetscRandomRegisterDynamic(PETSCRAND, path,"PetscRandomCreate_Rand", PetscRandomCreate_Rand);CHKERRQ(ierr); 167 #endif 168 #if defined(PETSC_HAVE_DRAND48) 169 ierr = PetscRandomRegisterDynamic(PETSCRAND48,path,"PetscRandomCreate_Rand48",PetscRandomCreate_Rand48);CHKERRQ(ierr); 170 #endif 171 #if defined(PETSC_HAVE_SPRNG) 172 ierr = PetscRandomRegisterDynamic(PETSCSPRNG,path,"PetscRandomCreate_Sprng",PetscRandomCreate_Sprng);CHKERRQ(ierr); 173 #endif 174 PetscFunctionReturn(0); 175 } 176 177