1# -------------------------------------------------------------------- 2 3class RandomType(object): 4 """The random number generator type.""" 5 RAND = S_(PETSCRAND) 6 RAND48 = S_(PETSCRAND48) 7 SPRNG = S_(PETSCSPRNG) 8 RANDER48 = S_(PETSCRANDER48) 9 RANDOM123 = S_(PETSCRANDOM123) 10 11# -------------------------------------------------------------------- 12 13 14cdef class Random(Object): 15 """The random number generator object. 16 17 See Also 18 -------- 19 petsc.PetscRandom 20 21 """ 22 23 Type = RandomType 24 25 def __cinit__(self) -> None: 26 self.obj = <PetscObject*> &self.rnd 27 self.rnd = NULL 28 29 def __call__(self) -> Scalar: 30 """Generate a scalar random number. 31 32 Not collective. 33 34 See Also 35 -------- 36 petsc.PetscRandomGetValue 37 38 """ 39 return self.getValue() 40 41 def view(self, Viewer viewer=None) -> None: 42 """View a random number generator object. 43 44 Collective. 45 46 Parameters 47 ---------- 48 viewer 49 A `Viewer` instance or `None` for the default viewer. 50 51 See Also 52 -------- 53 petsc.PetscRandomView 54 55 """ 56 assert self.obj != NULL 57 cdef PetscViewer vwr = NULL 58 if viewer is not None: vwr = viewer.vwr 59 CHKERR(PetscRandomView(self.rnd, vwr)) 60 61 def destroy(self) -> Self: 62 """Destroy the random number generator object. 63 64 Collective. 65 66 See Also 67 -------- 68 petsc.PetscRandomDestroy 69 70 """ 71 CHKERR(PetscRandomDestroy(&self.rnd)) 72 return self 73 74 def create(self, comm: Comm | None = None) -> Self: 75 """Create a random number generator object. 76 77 Collective. 78 79 Parameters 80 ---------- 81 comm 82 MPI communicator, defaults to `Sys.getDefaultComm`. 83 84 See Also 85 -------- 86 Sys.getDefaultComm, petsc.PetscRandomCreate 87 88 """ 89 cdef MPI_Comm ccomm = def_Comm(comm, PETSC_COMM_DEFAULT) 90 CHKERR(PetscRandomCreate(ccomm, &self.rnd)) 91 return self 92 93 def setType(self, rnd_type: Random.Type | str) -> None: 94 """Set the type of the random number generator object. 95 96 Collective. 97 98 Parameters 99 ---------- 100 rnd_type 101 The type of the generator. 102 103 See Also 104 -------- 105 getType, petsc.PetscRandomSetType 106 107 """ 108 cdef PetscRandomType cval = NULL 109 rnd_type = str2bytes(rnd_type, &cval) 110 CHKERR(PetscRandomSetType(self.rnd, cval)) 111 112 def getType(self) -> str: 113 """Return the type of the random number generator object. 114 115 Not collective. 116 117 See Also 118 -------- 119 setType, petsc.PetscRandomGetType 120 121 """ 122 cdef PetscRandomType cval = NULL 123 CHKERR(PetscRandomGetType(self.rnd, &cval)) 124 return bytes2str(cval) 125 126 def setFromOptions(self) -> None: 127 """Configure the random number generator from the options database. 128 129 Collective. 130 131 See Also 132 -------- 133 petsc_options, petsc.PetscRandomSetFromOptions 134 135 """ 136 CHKERR(PetscRandomSetFromOptions(self.rnd)) 137 138 def getValue(self) -> Scalar: 139 """Generate a scalar random number. 140 141 Not collective. 142 143 See Also 144 -------- 145 petsc.PetscRandomGetValue 146 147 """ 148 cdef PetscScalar sval = 0 149 CHKERR(PetscRandomGetValue(self.rnd, &sval)) 150 return toScalar(sval) 151 152 def getValueReal(self) -> float: 153 """Generate a real random number. 154 155 Not collective. 156 157 See Also 158 -------- 159 petsc.PetscRandomGetValueReal 160 161 """ 162 cdef PetscReal rval = 0 163 CHKERR(PetscRandomGetValueReal(self.rnd, &rval)) 164 return toReal(rval) 165 166 def getSeed(self) -> int: 167 """Return the random number generator seed. 168 169 Not collective. 170 171 See Also 172 -------- 173 setSeed, petsc.PetscRandomGetSeed 174 175 """ 176 cdef PetscInt64 seed = 0 177 CHKERR(PetscRandomGetSeed(self.rnd, &seed)) 178 return seed 179 180 def setSeed(self, seed: int | None = None) -> None: 181 """Set the seed of random number generator. 182 183 Not collective. 184 185 Parameters 186 ---------- 187 seed 188 The value for the seed. If `None`, it only seeds the generator. 189 190 See Also 191 -------- 192 getSeed, petsc.PetscRandomSetSeed, petsc.PetscRandomSeed 193 194 """ 195 if seed is not None: 196 CHKERR(PetscRandomSetSeed(self.rnd, seed)) 197 CHKERR(PetscRandomSeed(self.rnd)) 198 199 def getInterval(self) -> tuple[Scalar, Scalar]: 200 """Return the interval containing the random numbers generated. 201 202 Not collective. 203 204 See Also 205 -------- 206 setInterval, petsc.PetscRandomGetInterval 207 208 """ 209 cdef PetscScalar sval1 = 0 210 cdef PetscScalar sval2 = 1 211 CHKERR(PetscRandomGetInterval(self.rnd, &sval1, &sval2)) 212 return (toScalar(sval1), toScalar(sval2)) 213 214 def setInterval(self, interval: tuple[Scalar, Scalar]) -> None: 215 """Set the interval of the random number generator. 216 217 Not collective. 218 219 See Also 220 -------- 221 getInterval, petsc.PetscRandomSetInterval 222 223 """ 224 cdef PetscScalar sval1 = 0 225 cdef PetscScalar sval2 = 1 226 low, high = interval 227 sval1 = asScalar(low) 228 sval2 = asScalar(high) 229 CHKERR(PetscRandomSetInterval(self.rnd, sval1, sval2)) 230 231 # 232 233 property seed: 234 """The seed of the random number generator.""" 235 def __get__(self) -> int: 236 return self.getSeed() 237 238 def __set__(self, value: int | None) -> None: 239 self.setSeed(value) 240 241 property interval: 242 """The interval of the generated random numbers.""" 243 def __get__(self) -> tuple[Scalar, Scalar]: 244 return self.getInterval() 245 246 def __set__(self, value: tuple[Scalar, Scalar]): 247 self.setInterval(value) 248 249# -------------------------------------------------------------------- 250 251del RandomType 252 253# -------------------------------------------------------------------- 254