15c6c1daeSBarry Smith /* 25c6c1daeSBarry Smith This file contains routines for interfacing to random number generators. 35c6c1daeSBarry Smith This provides more than just an interface to some system random number 45c6c1daeSBarry Smith generator: 55c6c1daeSBarry Smith 65c6c1daeSBarry Smith Numbers can be shuffled for use as random tuples 75c6c1daeSBarry Smith 85c6c1daeSBarry Smith Multiple random number generators may be used 95c6c1daeSBarry Smith 105c6c1daeSBarry Smith We are still not sure what interface we want here. There should be 115c6c1daeSBarry Smith one to reinitialize and set the seed. 125c6c1daeSBarry Smith */ 135c6c1daeSBarry Smith 14d6cc7855SJacob Faibussowitsch #include <petsc/private/randomimpl.h> /*I "petscsys.h" I*/ 15665c2dedSJed Brown #include <petscviewer.h> 165c6c1daeSBarry Smith 175c6c1daeSBarry Smith /* Logging support */ 185c6c1daeSBarry Smith PetscClassId PETSC_RANDOM_CLASSID; 195c6c1daeSBarry Smith 204a1c5f42SJose E. Roman /*@C 21c31d2375SBarry Smith PetscRandomDestroy - Destroys a `PetscRandom` object that was created by `PetscRandomCreate()`. 225c6c1daeSBarry Smith 23c3339decSBarry Smith Collective 245c6c1daeSBarry Smith 2501d2d390SJose E. Roman Input Parameter: 26c31d2375SBarry Smith . r - the random number generator object 275c6c1daeSBarry Smith 285c6c1daeSBarry Smith Level: intermediate 295c6c1daeSBarry Smith 30811af0c4SBarry Smith .seealso: `PetscRandom`, `PetscRandomGetValue()`, `PetscRandomCreate()`, `VecSetRandom()` 315c6c1daeSBarry Smith @*/ 32d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomDestroy(PetscRandom *r) 33d71ae5a4SJacob Faibussowitsch { 345c6c1daeSBarry Smith PetscFunctionBegin; 353ba16761SJacob Faibussowitsch if (!*r) PetscFunctionReturn(PETSC_SUCCESS); 365c6c1daeSBarry Smith PetscValidHeaderSpecific(*r, PETSC_RANDOM_CLASSID, 1); 37f4f49eeaSPierre Jolivet if (--((PetscObject)*r)->refct > 0) { 389371c9d4SSatish Balay *r = NULL; 393ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 40e4e5cec9SBarry Smith } 41213acdd3SPierre Jolivet PetscTryTypeMethod(*r, destroy); 429566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(r)); 433ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 445c6c1daeSBarry Smith } 455c6c1daeSBarry Smith 46e8976759SBarry Smith /*@C 475c6c1daeSBarry Smith PetscRandomGetSeed - Gets the random seed. 485c6c1daeSBarry Smith 495c6c1daeSBarry Smith Not collective 505c6c1daeSBarry Smith 512fe279fdSBarry Smith Input Parameter: 525c6c1daeSBarry Smith . r - The random number generator context 535c6c1daeSBarry Smith 545c6c1daeSBarry Smith Output Parameter: 555c6c1daeSBarry Smith . seed - The random seed 565c6c1daeSBarry Smith 575c6c1daeSBarry Smith Level: intermediate 585c6c1daeSBarry Smith 59811af0c4SBarry Smith .seealso: `PetscRandom`, `PetscRandomCreate()`, `PetscRandomSetSeed()`, `PetscRandomSeed()` 605c6c1daeSBarry Smith @*/ 61d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomGetSeed(PetscRandom r, unsigned long *seed) 62d71ae5a4SJacob Faibussowitsch { 635c6c1daeSBarry Smith PetscFunctionBegin; 645c6c1daeSBarry Smith PetscValidHeaderSpecific(r, PETSC_RANDOM_CLASSID, 1); 655c6c1daeSBarry Smith if (seed) { 664f572ea9SToby Isaac PetscAssertPointer(seed, 2); 675c6c1daeSBarry Smith *seed = r->seed; 685c6c1daeSBarry Smith } 693ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 705c6c1daeSBarry Smith } 715c6c1daeSBarry Smith 72e8976759SBarry Smith /*@C 73811af0c4SBarry 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 8310450e9eSJacob Faibussowitsch Example Usage: 84811af0c4SBarry Smith .vb 855c6c1daeSBarry Smith PetscRandomSetSeed(r,a positive integer); 86811af0c4SBarry Smith PetscRandomSeed(r); 87811af0c4SBarry 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. 91811af0c4SBarry Smith .ve 925c6c1daeSBarry Smith 93811af0c4SBarry Smith .seealso: `PetscRandom`, `PetscRandomCreate()`, `PetscRandomGetSeed()`, `PetscRandomSeed()` 945c6c1daeSBarry Smith @*/ 95d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomSetSeed(PetscRandom r, unsigned long seed) 96d71ae5a4SJacob Faibussowitsch { 975c6c1daeSBarry Smith PetscFunctionBegin; 985c6c1daeSBarry Smith PetscValidHeaderSpecific(r, PETSC_RANDOM_CLASSID, 1); 995c6c1daeSBarry Smith r->seed = seed; 1009566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Setting seed to %d\n", (int)seed)); 1013ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1025c6c1daeSBarry Smith } 1035c6c1daeSBarry Smith 1045c6c1daeSBarry Smith /* ------------------------------------------------------------------- */ 1055c6c1daeSBarry Smith /* 1065c6c1daeSBarry Smith PetscRandomSetTypeFromOptions_Private - Sets the type of random generator from user options. Defaults to type PETSCRAND48 or PETSCRAND. 1075c6c1daeSBarry Smith 108c3339decSBarry Smith Collective 1095c6c1daeSBarry Smith 1105c6c1daeSBarry Smith Input Parameter: 1115c6c1daeSBarry Smith . rnd - The random number generator context 1125c6c1daeSBarry Smith 1135c6c1daeSBarry Smith Level: intermediate 1145c6c1daeSBarry Smith 115db781477SPatrick Sanan .seealso: `PetscRandomSetFromOptions()`, `PetscRandomSetType()` 1165c6c1daeSBarry Smith */ 117d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscRandomSetTypeFromOptions_Private(PetscRandom rnd, PetscOptionItems *PetscOptionsObject) 118d71ae5a4SJacob Faibussowitsch { 1195c6c1daeSBarry Smith PetscBool opt; 1205c6c1daeSBarry Smith const char *defaultType; 1215c6c1daeSBarry Smith char typeName[256]; 1225c6c1daeSBarry Smith 1235c6c1daeSBarry Smith PetscFunctionBegin; 1245c6c1daeSBarry Smith if (((PetscObject)rnd)->type_name) { 1255c6c1daeSBarry Smith defaultType = ((PetscObject)rnd)->type_name; 1265c6c1daeSBarry Smith } else { 127b3bd51deSBarry Smith defaultType = PETSCRANDER48; 1285c6c1daeSBarry Smith } 1295c6c1daeSBarry Smith 1309566063dSJacob Faibussowitsch PetscCall(PetscRandomRegisterAll()); 1319566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-random_type", "PetscRandom type", "PetscRandomSetType", PetscRandomList, defaultType, typeName, 256, &opt)); 1325c6c1daeSBarry Smith if (opt) { 1339566063dSJacob Faibussowitsch PetscCall(PetscRandomSetType(rnd, typeName)); 1345c6c1daeSBarry Smith } else { 1359566063dSJacob Faibussowitsch PetscCall(PetscRandomSetType(rnd, defaultType)); 1365c6c1daeSBarry Smith } 1373ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1385c6c1daeSBarry Smith } 1395c6c1daeSBarry Smith 1405c6c1daeSBarry Smith /*@ 1415c6c1daeSBarry Smith PetscRandomSetFromOptions - Configures the random number generator from the options database. 1425c6c1daeSBarry Smith 143c3339decSBarry Smith Collective 1445c6c1daeSBarry Smith 1455c6c1daeSBarry Smith Input Parameter: 1465c6c1daeSBarry Smith . rnd - The random number generator context 1475c6c1daeSBarry Smith 148811af0c4SBarry Smith Options Database Keys: 149da81f932SPierre Jolivet + -random_seed <integer> - provide a seed to the random number generator 15014a9496bSBarry Smith - -random_no_imaginary_part - makes the imaginary part of the random number zero, this is useful when you want the 15114a9496bSBarry Smith same code to produce the same result when run with real numbers or complex numbers for regression testing purposes 1525c6c1daeSBarry Smith 153c31d2375SBarry Smith Level: beginner 154c31d2375SBarry Smith 155811af0c4SBarry Smith Note: 156811af0c4SBarry Smith Must be called after `PetscRandomCreate()` but before the rnd is used. 1575c6c1daeSBarry Smith 158811af0c4SBarry Smith .seealso: `PetscRandom`, `PetscRandomCreate()`, `PetscRandomSetType()` 1595c6c1daeSBarry Smith @*/ 160d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomSetFromOptions(PetscRandom rnd) 161d71ae5a4SJacob Faibussowitsch { 16214a9496bSBarry Smith PetscBool set, noimaginary = PETSC_FALSE; 1635c6c1daeSBarry Smith PetscInt seed; 1645c6c1daeSBarry Smith 1655c6c1daeSBarry Smith PetscFunctionBegin; 1665c6c1daeSBarry Smith PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID, 1); 1675c6c1daeSBarry Smith 168d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)rnd); 1695c6c1daeSBarry Smith 1705c6c1daeSBarry Smith /* Handle PetscRandom type options */ 171dbbe0bcdSBarry Smith PetscCall(PetscRandomSetTypeFromOptions_Private(rnd, PetscOptionsObject)); 1725c6c1daeSBarry Smith 1735c6c1daeSBarry Smith /* Handle specific random generator's options */ 174dbbe0bcdSBarry Smith PetscTryTypeMethod(rnd, setfromoptions, PetscOptionsObject); 1759566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-random_seed", "Seed to use to generate random numbers", "PetscRandomSetSeed", 0, &seed, &set)); 1765c6c1daeSBarry Smith if (set) { 1779566063dSJacob Faibussowitsch PetscCall(PetscRandomSetSeed(rnd, (unsigned long int)seed)); 1789566063dSJacob Faibussowitsch PetscCall(PetscRandomSeed(rnd)); 1795c6c1daeSBarry Smith } 1809566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-random_no_imaginary_part", "The imaginary part of the random number will be zero", "PetscRandomSetInterval", noimaginary, &noimaginary, &set)); 18114a9496bSBarry Smith #if defined(PETSC_HAVE_COMPLEX) 18214a9496bSBarry Smith if (set) { 18314a9496bSBarry Smith if (noimaginary) { 18414a9496bSBarry Smith PetscScalar low, high; 1859566063dSJacob Faibussowitsch PetscCall(PetscRandomGetInterval(rnd, &low, &high)); 18614a9496bSBarry Smith low = low - PetscImaginaryPart(low); 18714a9496bSBarry Smith high = high - PetscImaginaryPart(high); 1889566063dSJacob Faibussowitsch PetscCall(PetscRandomSetInterval(rnd, low, high)); 18914a9496bSBarry Smith } 19014a9496bSBarry Smith } 19114a9496bSBarry Smith #endif 192d0609cedSBarry Smith PetscOptionsEnd(); 1939566063dSJacob Faibussowitsch PetscCall(PetscRandomViewFromOptions(rnd, NULL, "-random_view")); 1943ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1955c6c1daeSBarry Smith } 1965c6c1daeSBarry Smith 197e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 198e04113cfSBarry Smith #include <petscviewersaws.h> 199f05ece33SBarry Smith #endif 200fe2efc57SMark 201*ffeef943SBarry Smith /*@ 202811af0c4SBarry Smith PetscRandomViewFromOptions - View a `PetscRandom` object based on the options database 203fe2efc57SMark 204c3339decSBarry Smith Collective 205fe2efc57SMark 206fe2efc57SMark Input Parameters: 207fe2efc57SMark + A - the random number generator context 208736c3998SJose E. Roman . obj - Optional object 209736c3998SJose E. Roman - name - command line option 210fe2efc57SMark 211fe2efc57SMark Level: intermediate 212aec76313SJacob Faibussowitsch 213db781477SPatrick Sanan .seealso: `PetscRandom`, `PetscRandomView`, `PetscObjectViewFromOptions()`, `PetscRandomCreate()` 214fe2efc57SMark @*/ 215d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomViewFromOptions(PetscRandom A, PetscObject obj, const char name[]) 216d71ae5a4SJacob Faibussowitsch { 217fe2efc57SMark PetscFunctionBegin; 218fe2efc57SMark PetscValidHeaderSpecific(A, PETSC_RANDOM_CLASSID, 1); 2199566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name)); 2203ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 221fe2efc57SMark } 222fe2efc57SMark 223*ffeef943SBarry Smith /*@ 2245c6c1daeSBarry Smith PetscRandomView - Views a random number generator object. 2255c6c1daeSBarry Smith 226c3339decSBarry Smith Collective 2275c6c1daeSBarry Smith 2285c6c1daeSBarry Smith Input Parameters: 2295c6c1daeSBarry Smith + rnd - The random number generator context 2305c6c1daeSBarry Smith - viewer - an optional visualization context 2315c6c1daeSBarry Smith 232c31d2375SBarry Smith Level: beginner 233c31d2375SBarry Smith 234811af0c4SBarry Smith Note: 2355c6c1daeSBarry Smith The available visualization contexts include 236811af0c4SBarry Smith + `PETSC_VIEWER_STDOUT_SELF` - standard output (default) 237811af0c4SBarry Smith - `PETSC_VIEWER_STDOUT_WORLD` - synchronized standard 2385c6c1daeSBarry Smith output where only the first processor opens 2395c6c1daeSBarry Smith the file. All other processors send their 2405c6c1daeSBarry Smith data to the first processor to print. 2415c6c1daeSBarry Smith 242811af0c4SBarry Smith .seealso: `PetscRandom`, `PetscRealView()`, `PetscScalarView()`, `PetscIntView()` 2435c6c1daeSBarry Smith @*/ 244d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomView(PetscRandom rnd, PetscViewer viewer) 245d71ae5a4SJacob Faibussowitsch { 2465c6c1daeSBarry Smith PetscBool iascii; 247e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 248536b137fSBarry Smith PetscBool issaws; 249f05ece33SBarry Smith #endif 2505c6c1daeSBarry Smith 2515c6c1daeSBarry Smith PetscFunctionBegin; 2525c6c1daeSBarry Smith PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID, 1); 2535c6c1daeSBarry Smith PetscValidType(rnd, 1); 25448a46eb9SPierre Jolivet if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)rnd), &viewer)); 2555c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 2565c6c1daeSBarry Smith PetscCheckSameComm(rnd, 1, viewer, 2); 2579566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 258e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 2599566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSAWS, &issaws)); 260f05ece33SBarry Smith #endif 2615c6c1daeSBarry Smith if (iascii) { 2625c6c1daeSBarry Smith PetscMPIInt rank; 2639566063dSJacob Faibussowitsch PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)rnd, viewer)); 2649566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)rnd), &rank)); 2659566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushSynchronized(viewer)); 2669566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Random type %s, seed %lu\n", rank, ((PetscObject)rnd)->type_name, rnd->seed)); 2679566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(viewer)); 2689566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopSynchronized(viewer)); 269e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 270536b137fSBarry Smith } else if (issaws) { 271d45a07a7SBarry Smith PetscMPIInt rank; 2722657e9d9SBarry Smith const char *name; 273d45a07a7SBarry Smith 2749566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)rnd, &name)); 2759566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 276dd400576SPatrick Sanan if (!((PetscObject)rnd)->amsmem && rank == 0) { 277d45a07a7SBarry Smith char dir[1024]; 278d45a07a7SBarry Smith 2799566063dSJacob Faibussowitsch PetscCall(PetscObjectViewSAWs((PetscObject)rnd, viewer)); 2809566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(dir, 1024, "/PETSc/Objects/%s/Low", name)); 281792fecdfSBarry Smith PetscCallSAWs(SAWs_Register, (dir, &rnd->low, 1, SAWs_READ, SAWs_DOUBLE)); 282f05ece33SBarry Smith } 283f05ece33SBarry Smith #endif 2845c6c1daeSBarry Smith } 2853ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2865c6c1daeSBarry Smith } 2875c6c1daeSBarry Smith 2885c6c1daeSBarry Smith /*@ 289c31d2375SBarry Smith PetscRandomCreate - Creates an object for generating random numbers, 2905c6c1daeSBarry Smith and initializes the random-number generator. 2915c6c1daeSBarry Smith 292d083f849SBarry Smith Collective 2935c6c1daeSBarry Smith 29467be906fSBarry Smith Input Parameter: 295dc424cfaSBarry Smith . comm - MPI communicator 2965c6c1daeSBarry Smith 2975c6c1daeSBarry Smith Output Parameter: 298c31d2375SBarry Smith . r - the random number generator object 2995c6c1daeSBarry Smith 3005c6c1daeSBarry Smith Level: intermediate 3015c6c1daeSBarry Smith 3025c6c1daeSBarry Smith Notes: 303811af0c4SBarry Smith The random type has to be set by `PetscRandomSetType()`. 3045c6c1daeSBarry Smith 3056aad120cSJose E. Roman This is only a primitive "parallel" random number generator, it should NOT 3065c6c1daeSBarry Smith be used for sophisticated parallel Monte Carlo methods since it will very likely 3075c6c1daeSBarry Smith not have the correct statistics across processors. You can provide your own 30867be906fSBarry Smith parallel generator using `PetscRandomRegister()`; 3095c6c1daeSBarry Smith 310811af0c4SBarry Smith If you create a `PetscRandom()` using `PETSC_COMM_SELF` on several processors then 311811af0c4SBarry Smith the SAME random numbers will be generated on all those processors. Use `PETSC_COMM_WORLD` 3125c6c1daeSBarry Smith or the appropriate parallel communicator to eliminate this issue. 3135c6c1daeSBarry Smith 314811af0c4SBarry Smith Use `VecSetRandom()` to set the elements of a vector to random numbers. 3155c6c1daeSBarry Smith 3165c6c1daeSBarry Smith Example of Usage: 3175c6c1daeSBarry Smith .vb 3185c6c1daeSBarry Smith PetscRandomCreate(PETSC_COMM_SELF,&r); 3195c6c1daeSBarry Smith PetscRandomSetType(r,PETSCRAND48); 3205c6c1daeSBarry Smith PetscRandomGetValue(r,&value1); 3215c6c1daeSBarry Smith PetscRandomGetValueReal(r,&value2); 3225c6c1daeSBarry Smith PetscRandomDestroy(&r); 3235c6c1daeSBarry Smith .ve 3245c6c1daeSBarry Smith 325db781477SPatrick Sanan .seealso: `PetscRandomSetType()`, `PetscRandomGetValue()`, `PetscRandomGetValueReal()`, `PetscRandomSetInterval()`, 326811af0c4SBarry Smith `PetscRandomDestroy()`, `VecSetRandom()`, `PetscRandomType`, `PetscRandom` 3275c6c1daeSBarry Smith @*/ 328d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomCreate(MPI_Comm comm, PetscRandom *r) 329d71ae5a4SJacob Faibussowitsch { 3305c6c1daeSBarry Smith PetscRandom rr; 3315c6c1daeSBarry Smith PetscMPIInt rank; 3325c6c1daeSBarry Smith 3335c6c1daeSBarry Smith PetscFunctionBegin; 3344f572ea9SToby Isaac PetscAssertPointer(r, 2); 3350298fd71SBarry Smith *r = NULL; 3369566063dSJacob Faibussowitsch PetscCall(PetscRandomInitializePackage()); 3375c6c1daeSBarry Smith 3389566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(rr, PETSC_RANDOM_CLASSID, "PetscRandom", "Random number generator", "Sys", comm, PetscRandomDestroy, PetscRandomView)); 3395c6c1daeSBarry Smith 3409566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 341a297a907SKarl Rupp 3420298fd71SBarry Smith rr->data = NULL; 3435c6c1daeSBarry Smith rr->low = 0.0; 3445c6c1daeSBarry Smith rr->width = 1.0; 3455c6c1daeSBarry Smith rr->iset = PETSC_FALSE; 3465c6c1daeSBarry Smith rr->seed = 0x12345678 + 76543 * rank; 3479566063dSJacob Faibussowitsch PetscCall(PetscRandomSetType(rr, PETSCRANDER48)); 3485c6c1daeSBarry Smith *r = rr; 3493ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3505c6c1daeSBarry Smith } 3515c6c1daeSBarry Smith 3525c6c1daeSBarry Smith /*@ 353811af0c4SBarry Smith PetscRandomSeed - Seed the random number generator. 3545c6c1daeSBarry Smith 3555c6c1daeSBarry Smith Not collective 3565c6c1daeSBarry Smith 3572fe279fdSBarry Smith Input Parameter: 3585c6c1daeSBarry Smith . r - The random number generator context 3595c6c1daeSBarry Smith 3605c6c1daeSBarry Smith Level: intermediate 3615c6c1daeSBarry Smith 36210450e9eSJacob Faibussowitsch Example Usage: 363811af0c4SBarry Smith .vb 3645c6c1daeSBarry Smith PetscRandomSetSeed(r,a positive integer); 365811af0c4SBarry Smith PetscRandomSeed(r); 366811af0c4SBarry Smith PetscRandomGetValue() will now start with the new seed. 3675c6c1daeSBarry Smith 3685c6c1daeSBarry Smith PetscRandomSeed(r) without a call to PetscRandomSetSeed() re-initializes 3695c6c1daeSBarry Smith the seed. The random numbers generated will be the same as before. 370811af0c4SBarry Smith .ve 3715c6c1daeSBarry Smith 372db781477SPatrick Sanan .seealso: `PetscRandomCreate()`, `PetscRandomGetSeed()`, `PetscRandomSetSeed()` 3735c6c1daeSBarry Smith @*/ 374d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomSeed(PetscRandom r) 375d71ae5a4SJacob Faibussowitsch { 3765c6c1daeSBarry Smith PetscFunctionBegin; 3775c6c1daeSBarry Smith PetscValidHeaderSpecific(r, PETSC_RANDOM_CLASSID, 1); 3785c6c1daeSBarry Smith PetscValidType(r, 1); 3795c6c1daeSBarry Smith 380dbbe0bcdSBarry Smith PetscUseTypeMethod(r, seed); 3819566063dSJacob Faibussowitsch PetscCall(PetscObjectStateIncrease((PetscObject)r)); 3823ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3835c6c1daeSBarry Smith } 384