15c6c1daeSBarry Smith 25c6c1daeSBarry Smith /* 35c6c1daeSBarry Smith This file contains routines for interfacing to random number generators. 45c6c1daeSBarry Smith This provides more than just an interface to some system random number 55c6c1daeSBarry Smith generator: 65c6c1daeSBarry Smith 75c6c1daeSBarry Smith Numbers can be shuffled for use as random tuples 85c6c1daeSBarry Smith 95c6c1daeSBarry Smith Multiple random number generators may be used 105c6c1daeSBarry Smith 115c6c1daeSBarry Smith We are still not sure what interface we want here. There should be 125c6c1daeSBarry Smith one to reinitialize and set the seed. 135c6c1daeSBarry Smith */ 145c6c1daeSBarry Smith 15d6cc7855SJacob Faibussowitsch #include <petsc/private/randomimpl.h> /*I "petscsys.h" I*/ 16665c2dedSJed Brown #include <petscviewer.h> 175c6c1daeSBarry Smith 185c6c1daeSBarry Smith /* Logging support */ 195c6c1daeSBarry Smith PetscClassId PETSC_RANDOM_CLASSID; 205c6c1daeSBarry Smith 214a1c5f42SJose E. Roman /*@C 225c6c1daeSBarry Smith PetscRandomDestroy - Destroys a context that has been formed by 23*811af0c4SBarry Smith `PetscRandomCreate()`. 245c6c1daeSBarry Smith 25*811af0c4SBarry Smith Collective on r 265c6c1daeSBarry Smith 2701d2d390SJose E. Roman Input Parameter: 285c6c1daeSBarry Smith . r - the random number generator context 295c6c1daeSBarry Smith 305c6c1daeSBarry Smith Level: intermediate 315c6c1daeSBarry Smith 32*811af0c4SBarry Smith .seealso: `PetscRandom`, `PetscRandomGetValue()`, `PetscRandomCreate()`, `VecSetRandom()` 335c6c1daeSBarry Smith @*/ 349371c9d4SSatish Balay PetscErrorCode PetscRandomDestroy(PetscRandom *r) { 355c6c1daeSBarry Smith PetscFunctionBegin; 365c6c1daeSBarry Smith if (!*r) PetscFunctionReturn(0); 375c6c1daeSBarry Smith PetscValidHeaderSpecific(*r, PETSC_RANDOM_CLASSID, 1); 389371c9d4SSatish Balay if (--((PetscObject)(*r))->refct > 0) { 399371c9d4SSatish Balay *r = NULL; 409371c9d4SSatish Balay PetscFunctionReturn(0); 41e4e5cec9SBarry Smith } 4248a46eb9SPierre Jolivet if ((*r)->ops->destroy) PetscCall((*(*r)->ops->destroy)(*r)); 439566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(r)); 445c6c1daeSBarry Smith PetscFunctionReturn(0); 455c6c1daeSBarry Smith } 465c6c1daeSBarry Smith 47e8976759SBarry Smith /*@C 485c6c1daeSBarry Smith PetscRandomGetSeed - Gets the random seed. 495c6c1daeSBarry Smith 505c6c1daeSBarry Smith Not collective 515c6c1daeSBarry Smith 525c6c1daeSBarry Smith Input Parameters: 535c6c1daeSBarry Smith . r - The random number generator context 545c6c1daeSBarry Smith 555c6c1daeSBarry Smith Output Parameter: 565c6c1daeSBarry Smith . seed - The random seed 575c6c1daeSBarry Smith 585c6c1daeSBarry Smith Level: intermediate 595c6c1daeSBarry Smith 60*811af0c4SBarry Smith .seealso: `PetscRandom`, `PetscRandomCreate()`, `PetscRandomSetSeed()`, `PetscRandomSeed()` 615c6c1daeSBarry Smith @*/ 629371c9d4SSatish Balay PetscErrorCode PetscRandomGetSeed(PetscRandom r, unsigned long *seed) { 635c6c1daeSBarry Smith PetscFunctionBegin; 645c6c1daeSBarry Smith PetscValidHeaderSpecific(r, PETSC_RANDOM_CLASSID, 1); 655c6c1daeSBarry Smith if (seed) { 665c6c1daeSBarry Smith PetscValidPointer(seed, 2); 675c6c1daeSBarry Smith *seed = r->seed; 685c6c1daeSBarry Smith } 695c6c1daeSBarry Smith PetscFunctionReturn(0); 705c6c1daeSBarry Smith } 715c6c1daeSBarry Smith 72e8976759SBarry Smith /*@C 73*811af0c4SBarry Smith PetscRandomSetSeed - Sets the random seed. You MUST call `PetscRandomSeed()` after this call to have the new seed used. 745c6c1daeSBarry Smith 755c6c1daeSBarry Smith Not collective 765c6c1daeSBarry Smith 775c6c1daeSBarry Smith Input Parameters: 785c6c1daeSBarry Smith + r - The random number generator context 795c6c1daeSBarry Smith - seed - The random seed 805c6c1daeSBarry Smith 815c6c1daeSBarry Smith Level: intermediate 825c6c1daeSBarry Smith 835c6c1daeSBarry Smith Usage: 84*811af0c4SBarry Smith .vb 855c6c1daeSBarry Smith PetscRandomSetSeed(r,a positive integer); 86*811af0c4SBarry Smith PetscRandomSeed(r); 87*811af0c4SBarry Smith PetscRandomGetValue() will now start with the new seed. 885c6c1daeSBarry Smith 895c6c1daeSBarry Smith PetscRandomSeed(r) without a call to PetscRandomSetSeed() re-initializes 905c6c1daeSBarry Smith the seed. The random numbers generated will be the same as before. 91*811af0c4SBarry Smith .ve 925c6c1daeSBarry Smith 93*811af0c4SBarry Smith .seealso: `PetscRandom`, `PetscRandomCreate()`, `PetscRandomGetSeed()`, `PetscRandomSeed()` 945c6c1daeSBarry Smith @*/ 959371c9d4SSatish Balay PetscErrorCode PetscRandomSetSeed(PetscRandom r, unsigned long seed) { 965c6c1daeSBarry Smith PetscFunctionBegin; 975c6c1daeSBarry Smith PetscValidHeaderSpecific(r, PETSC_RANDOM_CLASSID, 1); 985c6c1daeSBarry Smith r->seed = seed; 999566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Setting seed to %d\n", (int)seed)); 1005c6c1daeSBarry Smith PetscFunctionReturn(0); 1015c6c1daeSBarry Smith } 1025c6c1daeSBarry Smith 1035c6c1daeSBarry Smith /* ------------------------------------------------------------------- */ 1045c6c1daeSBarry Smith /* 1055c6c1daeSBarry Smith PetscRandomSetTypeFromOptions_Private - Sets the type of random generator from user options. Defaults to type PETSCRAND48 or PETSCRAND. 1065c6c1daeSBarry Smith 107*811af0c4SBarry Smith Collective on rnd 1085c6c1daeSBarry Smith 1095c6c1daeSBarry Smith Input Parameter: 1105c6c1daeSBarry Smith . rnd - The random number generator context 1115c6c1daeSBarry Smith 1125c6c1daeSBarry Smith Level: intermediate 1135c6c1daeSBarry Smith 114db781477SPatrick Sanan .seealso: `PetscRandomSetFromOptions()`, `PetscRandomSetType()` 1155c6c1daeSBarry Smith */ 1169371c9d4SSatish Balay static PetscErrorCode PetscRandomSetTypeFromOptions_Private(PetscRandom rnd, PetscOptionItems *PetscOptionsObject) { 1175c6c1daeSBarry Smith PetscBool opt; 1185c6c1daeSBarry Smith const char *defaultType; 1195c6c1daeSBarry Smith char typeName[256]; 1205c6c1daeSBarry Smith 1215c6c1daeSBarry Smith PetscFunctionBegin; 1225c6c1daeSBarry Smith if (((PetscObject)rnd)->type_name) { 1235c6c1daeSBarry Smith defaultType = ((PetscObject)rnd)->type_name; 1245c6c1daeSBarry Smith } else { 125b3bd51deSBarry Smith defaultType = PETSCRANDER48; 1265c6c1daeSBarry Smith } 1275c6c1daeSBarry Smith 1289566063dSJacob Faibussowitsch PetscCall(PetscRandomRegisterAll()); 1299566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-random_type", "PetscRandom type", "PetscRandomSetType", PetscRandomList, defaultType, typeName, 256, &opt)); 1305c6c1daeSBarry Smith if (opt) { 1319566063dSJacob Faibussowitsch PetscCall(PetscRandomSetType(rnd, typeName)); 1325c6c1daeSBarry Smith } else { 1339566063dSJacob Faibussowitsch PetscCall(PetscRandomSetType(rnd, defaultType)); 1345c6c1daeSBarry Smith } 1355c6c1daeSBarry Smith PetscFunctionReturn(0); 1365c6c1daeSBarry Smith } 1375c6c1daeSBarry Smith 1385c6c1daeSBarry Smith /*@ 1395c6c1daeSBarry Smith PetscRandomSetFromOptions - Configures the random number generator from the options database. 1405c6c1daeSBarry Smith 141*811af0c4SBarry Smith Collective on rnd 1425c6c1daeSBarry Smith 1435c6c1daeSBarry Smith Input Parameter: 1445c6c1daeSBarry Smith . rnd - The random number generator context 1455c6c1daeSBarry Smith 146*811af0c4SBarry Smith Options Database Keys: 14714a9496bSBarry Smith + -random_seed <integer> - provide a seed to the random number generater 14814a9496bSBarry Smith - -random_no_imaginary_part - makes the imaginary part of the random number zero, this is useful when you want the 14914a9496bSBarry Smith same code to produce the same result when run with real numbers or complex numbers for regression testing purposes 1505c6c1daeSBarry Smith 151*811af0c4SBarry Smith Note: 152*811af0c4SBarry Smith Must be called after `PetscRandomCreate()` but before the rnd is used. 1535c6c1daeSBarry Smith 1545c6c1daeSBarry Smith Level: beginner 1555c6c1daeSBarry Smith 156*811af0c4SBarry Smith .seealso: `PetscRandom`, `PetscRandomCreate()`, `PetscRandomSetType()` 1575c6c1daeSBarry Smith @*/ 1589371c9d4SSatish Balay PetscErrorCode PetscRandomSetFromOptions(PetscRandom rnd) { 15914a9496bSBarry Smith PetscBool set, noimaginary = PETSC_FALSE; 1605c6c1daeSBarry Smith PetscInt seed; 1615c6c1daeSBarry Smith 1625c6c1daeSBarry Smith PetscFunctionBegin; 1635c6c1daeSBarry Smith PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID, 1); 1645c6c1daeSBarry Smith 165d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)rnd); 1665c6c1daeSBarry Smith 1675c6c1daeSBarry Smith /* Handle PetscRandom type options */ 168dbbe0bcdSBarry Smith PetscCall(PetscRandomSetTypeFromOptions_Private(rnd, PetscOptionsObject)); 1695c6c1daeSBarry Smith 1705c6c1daeSBarry Smith /* Handle specific random generator's options */ 171dbbe0bcdSBarry Smith PetscTryTypeMethod(rnd, setfromoptions, PetscOptionsObject); 1729566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-random_seed", "Seed to use to generate random numbers", "PetscRandomSetSeed", 0, &seed, &set)); 1735c6c1daeSBarry Smith if (set) { 1749566063dSJacob Faibussowitsch PetscCall(PetscRandomSetSeed(rnd, (unsigned long int)seed)); 1759566063dSJacob Faibussowitsch PetscCall(PetscRandomSeed(rnd)); 1765c6c1daeSBarry Smith } 1779566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-random_no_imaginary_part", "The imaginary part of the random number will be zero", "PetscRandomSetInterval", noimaginary, &noimaginary, &set)); 17814a9496bSBarry Smith #if defined(PETSC_HAVE_COMPLEX) 17914a9496bSBarry Smith if (set) { 18014a9496bSBarry Smith if (noimaginary) { 18114a9496bSBarry Smith PetscScalar low, high; 1829566063dSJacob Faibussowitsch PetscCall(PetscRandomGetInterval(rnd, &low, &high)); 18314a9496bSBarry Smith low = low - PetscImaginaryPart(low); 18414a9496bSBarry Smith high = high - PetscImaginaryPart(high); 1859566063dSJacob Faibussowitsch PetscCall(PetscRandomSetInterval(rnd, low, high)); 18614a9496bSBarry Smith } 18714a9496bSBarry Smith } 18814a9496bSBarry Smith #endif 189d0609cedSBarry Smith PetscOptionsEnd(); 1909566063dSJacob Faibussowitsch PetscCall(PetscRandomViewFromOptions(rnd, NULL, "-random_view")); 1915c6c1daeSBarry Smith PetscFunctionReturn(0); 1925c6c1daeSBarry Smith } 1935c6c1daeSBarry Smith 194e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 195e04113cfSBarry Smith #include <petscviewersaws.h> 196f05ece33SBarry Smith #endif 197fe2efc57SMark 198fe2efc57SMark /*@C 199*811af0c4SBarry Smith PetscRandomViewFromOptions - View a `PetscRandom` object based on the options database 200fe2efc57SMark 201*811af0c4SBarry Smith Collective on A 202fe2efc57SMark 203fe2efc57SMark Input Parameters: 204fe2efc57SMark + A - the random number generator context 205736c3998SJose E. Roman . obj - Optional object 206736c3998SJose E. Roman - name - command line option 207fe2efc57SMark 208fe2efc57SMark Level: intermediate 209db781477SPatrick Sanan .seealso: `PetscRandom`, `PetscRandomView`, `PetscObjectViewFromOptions()`, `PetscRandomCreate()` 210fe2efc57SMark @*/ 2119371c9d4SSatish Balay PetscErrorCode PetscRandomViewFromOptions(PetscRandom A, PetscObject obj, const char name[]) { 212fe2efc57SMark PetscFunctionBegin; 213fe2efc57SMark PetscValidHeaderSpecific(A, PETSC_RANDOM_CLASSID, 1); 2149566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name)); 215fe2efc57SMark PetscFunctionReturn(0); 216fe2efc57SMark } 217fe2efc57SMark 2185c6c1daeSBarry Smith /*@C 2195c6c1daeSBarry Smith PetscRandomView - Views a random number generator object. 2205c6c1daeSBarry Smith 221*811af0c4SBarry Smith Collective on rnd 2225c6c1daeSBarry Smith 2235c6c1daeSBarry Smith Input Parameters: 2245c6c1daeSBarry Smith + rnd - The random number generator context 2255c6c1daeSBarry Smith - viewer - an optional visualization context 2265c6c1daeSBarry Smith 227*811af0c4SBarry Smith Note: 2285c6c1daeSBarry Smith The available visualization contexts include 229*811af0c4SBarry Smith + `PETSC_VIEWER_STDOUT_SELF` - standard output (default) 230*811af0c4SBarry Smith - `PETSC_VIEWER_STDOUT_WORLD` - synchronized standard 2315c6c1daeSBarry Smith output where only the first processor opens 2325c6c1daeSBarry Smith the file. All other processors send their 2335c6c1daeSBarry Smith data to the first processor to print. 2345c6c1daeSBarry Smith 2355c6c1daeSBarry Smith Level: beginner 2365c6c1daeSBarry Smith 237*811af0c4SBarry Smith .seealso: `PetscRandom`, `PetscRealView()`, `PetscScalarView()`, `PetscIntView()` 2385c6c1daeSBarry Smith @*/ 2399371c9d4SSatish Balay PetscErrorCode PetscRandomView(PetscRandom rnd, PetscViewer viewer) { 2405c6c1daeSBarry Smith PetscBool iascii; 241e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 242536b137fSBarry Smith PetscBool issaws; 243f05ece33SBarry Smith #endif 2445c6c1daeSBarry Smith 2455c6c1daeSBarry Smith PetscFunctionBegin; 2465c6c1daeSBarry Smith PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID, 1); 2475c6c1daeSBarry Smith PetscValidType(rnd, 1); 24848a46eb9SPierre Jolivet if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)rnd), &viewer)); 2495c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 2505c6c1daeSBarry Smith PetscCheckSameComm(rnd, 1, viewer, 2); 2519566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 252e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 2539566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSAWS, &issaws)); 254f05ece33SBarry Smith #endif 2555c6c1daeSBarry Smith if (iascii) { 2565c6c1daeSBarry Smith PetscMPIInt rank; 2579566063dSJacob Faibussowitsch PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)rnd, viewer)); 2589566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)rnd), &rank)); 2599566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushSynchronized(viewer)); 2609566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Random type %s, seed %lu\n", rank, ((PetscObject)rnd)->type_name, rnd->seed)); 2619566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(viewer)); 2629566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopSynchronized(viewer)); 263e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 264536b137fSBarry Smith } else if (issaws) { 265d45a07a7SBarry Smith PetscMPIInt rank; 2662657e9d9SBarry Smith const char *name; 267d45a07a7SBarry Smith 2689566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)rnd, &name)); 2699566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 270dd400576SPatrick Sanan if (!((PetscObject)rnd)->amsmem && rank == 0) { 271d45a07a7SBarry Smith char dir[1024]; 272d45a07a7SBarry Smith 2739566063dSJacob Faibussowitsch PetscCall(PetscObjectViewSAWs((PetscObject)rnd, viewer)); 2749566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(dir, 1024, "/PETSc/Objects/%s/Low", name)); 275792fecdfSBarry Smith PetscCallSAWs(SAWs_Register, (dir, &rnd->low, 1, SAWs_READ, SAWs_DOUBLE)); 276f05ece33SBarry Smith } 277f05ece33SBarry Smith #endif 2785c6c1daeSBarry Smith } 2795c6c1daeSBarry Smith PetscFunctionReturn(0); 2805c6c1daeSBarry Smith } 2815c6c1daeSBarry Smith 2825c6c1daeSBarry Smith /*@ 2835c6c1daeSBarry Smith PetscRandomCreate - Creates a context for generating random numbers, 2845c6c1daeSBarry Smith and initializes the random-number generator. 2855c6c1daeSBarry Smith 286d083f849SBarry Smith Collective 2875c6c1daeSBarry Smith 2885c6c1daeSBarry Smith Input Parameters: 289dc424cfaSBarry Smith . comm - MPI communicator 2905c6c1daeSBarry Smith 2915c6c1daeSBarry Smith Output Parameter: 2925c6c1daeSBarry Smith . r - the random number generator context 2935c6c1daeSBarry Smith 2945c6c1daeSBarry Smith Level: intermediate 2955c6c1daeSBarry Smith 2965c6c1daeSBarry Smith Notes: 297*811af0c4SBarry Smith The random type has to be set by `PetscRandomSetType()`. 2985c6c1daeSBarry Smith 2996aad120cSJose E. Roman This is only a primitive "parallel" random number generator, it should NOT 3005c6c1daeSBarry Smith be used for sophisticated parallel Monte Carlo methods since it will very likely 3015c6c1daeSBarry Smith not have the correct statistics across processors. You can provide your own 3025c6c1daeSBarry Smith parallel generator using PetscRandomRegister(); 3035c6c1daeSBarry Smith 304*811af0c4SBarry Smith If you create a `PetscRandom()` using `PETSC_COMM_SELF` on several processors then 305*811af0c4SBarry Smith the SAME random numbers will be generated on all those processors. Use `PETSC_COMM_WORLD` 3065c6c1daeSBarry Smith or the appropriate parallel communicator to eliminate this issue. 3075c6c1daeSBarry Smith 308*811af0c4SBarry Smith Use `VecSetRandom()` to set the elements of a vector to random numbers. 3095c6c1daeSBarry Smith 3105c6c1daeSBarry Smith Example of Usage: 3115c6c1daeSBarry Smith .vb 3125c6c1daeSBarry Smith PetscRandomCreate(PETSC_COMM_SELF,&r); 3135c6c1daeSBarry Smith PetscRandomSetType(r,PETSCRAND48); 3145c6c1daeSBarry Smith PetscRandomGetValue(r,&value1); 3155c6c1daeSBarry Smith PetscRandomGetValueReal(r,&value2); 3165c6c1daeSBarry Smith PetscRandomDestroy(&r); 3175c6c1daeSBarry Smith .ve 3185c6c1daeSBarry Smith 319db781477SPatrick Sanan .seealso: `PetscRandomSetType()`, `PetscRandomGetValue()`, `PetscRandomGetValueReal()`, `PetscRandomSetInterval()`, 320*811af0c4SBarry Smith `PetscRandomDestroy()`, `VecSetRandom()`, `PetscRandomType`, `PetscRandom` 3215c6c1daeSBarry Smith @*/ 3225c6c1daeSBarry Smith 3239371c9d4SSatish Balay PetscErrorCode PetscRandomCreate(MPI_Comm comm, PetscRandom *r) { 3245c6c1daeSBarry Smith PetscRandom rr; 3255c6c1daeSBarry Smith PetscMPIInt rank; 3265c6c1daeSBarry Smith 3275c6c1daeSBarry Smith PetscFunctionBegin; 328064a246eSJacob Faibussowitsch PetscValidPointer(r, 2); 3290298fd71SBarry Smith *r = NULL; 3309566063dSJacob Faibussowitsch PetscCall(PetscRandomInitializePackage()); 3315c6c1daeSBarry Smith 3329566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(rr, PETSC_RANDOM_CLASSID, "PetscRandom", "Random number generator", "Sys", comm, PetscRandomDestroy, PetscRandomView)); 3335c6c1daeSBarry Smith 3349566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 335a297a907SKarl Rupp 3360298fd71SBarry Smith rr->data = NULL; 3375c6c1daeSBarry Smith rr->low = 0.0; 3385c6c1daeSBarry Smith rr->width = 1.0; 3395c6c1daeSBarry Smith rr->iset = PETSC_FALSE; 3405c6c1daeSBarry Smith rr->seed = 0x12345678 + 76543 * rank; 3419566063dSJacob Faibussowitsch PetscCall(PetscRandomSetType(rr, PETSCRANDER48)); 3425c6c1daeSBarry Smith *r = rr; 3435c6c1daeSBarry Smith PetscFunctionReturn(0); 3445c6c1daeSBarry Smith } 3455c6c1daeSBarry Smith 3465c6c1daeSBarry Smith /*@ 347*811af0c4SBarry Smith PetscRandomSeed - Seed the random number generator. 3485c6c1daeSBarry Smith 3495c6c1daeSBarry Smith Not collective 3505c6c1daeSBarry Smith 3515c6c1daeSBarry Smith Input Parameters: 3525c6c1daeSBarry Smith . r - The random number generator context 3535c6c1daeSBarry Smith 3545c6c1daeSBarry Smith Level: intermediate 3555c6c1daeSBarry Smith 3565c6c1daeSBarry Smith Usage: 357*811af0c4SBarry Smith .vb 3585c6c1daeSBarry Smith PetscRandomSetSeed(r,a positive integer); 359*811af0c4SBarry Smith PetscRandomSeed(r); 360*811af0c4SBarry Smith PetscRandomGetValue() will now start with the new seed. 3615c6c1daeSBarry Smith 3625c6c1daeSBarry Smith PetscRandomSeed(r) without a call to PetscRandomSetSeed() re-initializes 3635c6c1daeSBarry Smith the seed. The random numbers generated will be the same as before. 364*811af0c4SBarry Smith .ve 3655c6c1daeSBarry Smith 366db781477SPatrick Sanan .seealso: `PetscRandomCreate()`, `PetscRandomGetSeed()`, `PetscRandomSetSeed()` 3675c6c1daeSBarry Smith @*/ 3689371c9d4SSatish Balay PetscErrorCode PetscRandomSeed(PetscRandom r) { 3695c6c1daeSBarry Smith PetscFunctionBegin; 3705c6c1daeSBarry Smith PetscValidHeaderSpecific(r, PETSC_RANDOM_CLASSID, 1); 3715c6c1daeSBarry Smith PetscValidType(r, 1); 3725c6c1daeSBarry Smith 373dbbe0bcdSBarry Smith PetscUseTypeMethod(r, seed); 3749566063dSJacob Faibussowitsch PetscCall(PetscObjectStateIncrease((PetscObject)r)); 3755c6c1daeSBarry Smith PetscFunctionReturn(0); 3765c6c1daeSBarry Smith } 377