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 200764c050SBarry Smith /*@ 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 @*/ 61ce78bad3SBarry Smith PetscErrorCode PetscRandomGetSeed(PetscRandom r, PetscInt64 *seed) 62d71ae5a4SJacob Faibussowitsch { 635c6c1daeSBarry Smith PetscFunctionBegin; 645c6c1daeSBarry Smith PetscValidHeaderSpecific(r, PETSC_RANDOM_CLASSID, 1); 655c6c1daeSBarry Smith if (seed) { 664f572ea9SToby Isaac PetscAssertPointer(seed, 2); 67ce78bad3SBarry Smith *seed = (PetscInt64)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 @*/ 95ce78bad3SBarry Smith PetscErrorCode PetscRandomSetSeed(PetscRandom r, PetscInt64 seed) 96d71ae5a4SJacob Faibussowitsch { 975c6c1daeSBarry Smith PetscFunctionBegin; 985c6c1daeSBarry Smith PetscValidHeaderSpecific(r, PETSC_RANDOM_CLASSID, 1); 99ce78bad3SBarry Smith r->seed = (unsigned long)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 */ 117ce78bad3SBarry Smith 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 19744ffe595SStefano Zampini /*@ 19844ffe595SStefano Zampini PetscRandomSetOptionsPrefix - Sets the prefix used for searching for all 19944ffe595SStefano Zampini `PetscRandom` options in the database. 20044ffe595SStefano Zampini 20144ffe595SStefano Zampini Logically Collective 20244ffe595SStefano Zampini 20344ffe595SStefano Zampini Input Parameters: 20444ffe595SStefano Zampini + r - the random number generator context 20544ffe595SStefano Zampini - prefix - the prefix to prepend to all option names 20644ffe595SStefano Zampini 20744ffe595SStefano Zampini Level: advanced 20844ffe595SStefano Zampini 20944ffe595SStefano Zampini Note: 21044ffe595SStefano Zampini A hyphen (-) must NOT be given at the beginning of the prefix name. 21144ffe595SStefano Zampini The first character of all runtime options is AUTOMATICALLY the hyphen. 21244ffe595SStefano Zampini 21344ffe595SStefano Zampini .seealso: `PetscRandom`, `PetscRandomSetFromOptions()` 21444ffe595SStefano Zampini @*/ 21544ffe595SStefano Zampini PetscErrorCode PetscRandomSetOptionsPrefix(PetscRandom r, const char prefix[]) 21644ffe595SStefano Zampini { 21744ffe595SStefano Zampini PetscFunctionBegin; 21844ffe595SStefano Zampini PetscValidHeaderSpecific(r, PETSC_RANDOM_CLASSID, 1); 21944ffe595SStefano Zampini PetscCall(PetscObjectSetOptionsPrefix((PetscObject)r, prefix)); 22044ffe595SStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 22144ffe595SStefano Zampini } 22244ffe595SStefano Zampini 223e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 224e04113cfSBarry Smith #include <petscviewersaws.h> 225f05ece33SBarry Smith #endif 226fe2efc57SMark 227ffeef943SBarry Smith /*@ 228811af0c4SBarry Smith PetscRandomViewFromOptions - View a `PetscRandom` object based on the options database 229fe2efc57SMark 230c3339decSBarry Smith Collective 231fe2efc57SMark 232fe2efc57SMark Input Parameters: 233fe2efc57SMark + A - the random number generator context 234736c3998SJose E. Roman . obj - Optional object 235736c3998SJose E. Roman - name - command line option 236fe2efc57SMark 237fe2efc57SMark Level: intermediate 238aec76313SJacob Faibussowitsch 239db781477SPatrick Sanan .seealso: `PetscRandom`, `PetscRandomView`, `PetscObjectViewFromOptions()`, `PetscRandomCreate()` 240fe2efc57SMark @*/ 241d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomViewFromOptions(PetscRandom A, PetscObject obj, const char name[]) 242d71ae5a4SJacob Faibussowitsch { 243fe2efc57SMark PetscFunctionBegin; 244fe2efc57SMark PetscValidHeaderSpecific(A, PETSC_RANDOM_CLASSID, 1); 2459566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name)); 2463ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 247fe2efc57SMark } 248fe2efc57SMark 249ffeef943SBarry Smith /*@ 2505c6c1daeSBarry Smith PetscRandomView - Views a random number generator object. 2515c6c1daeSBarry Smith 252c3339decSBarry Smith Collective 2535c6c1daeSBarry Smith 2545c6c1daeSBarry Smith Input Parameters: 2555c6c1daeSBarry Smith + rnd - The random number generator context 2565c6c1daeSBarry Smith - viewer - an optional visualization context 2575c6c1daeSBarry Smith 258c31d2375SBarry Smith Level: beginner 259c31d2375SBarry Smith 260811af0c4SBarry Smith Note: 2615c6c1daeSBarry Smith The available visualization contexts include 262811af0c4SBarry Smith + `PETSC_VIEWER_STDOUT_SELF` - standard output (default) 263811af0c4SBarry Smith - `PETSC_VIEWER_STDOUT_WORLD` - synchronized standard 2645c6c1daeSBarry Smith output where only the first processor opens 2655c6c1daeSBarry Smith the file. All other processors send their 2665c6c1daeSBarry Smith data to the first processor to print. 2675c6c1daeSBarry Smith 268811af0c4SBarry Smith .seealso: `PetscRandom`, `PetscRealView()`, `PetscScalarView()`, `PetscIntView()` 2695c6c1daeSBarry Smith @*/ 270d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomView(PetscRandom rnd, PetscViewer viewer) 271d71ae5a4SJacob Faibussowitsch { 272*9f196a02SMartin Diehl PetscBool isascii; 273e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 274536b137fSBarry Smith PetscBool issaws; 275f05ece33SBarry Smith #endif 2765c6c1daeSBarry Smith 2775c6c1daeSBarry Smith PetscFunctionBegin; 2785c6c1daeSBarry Smith PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID, 1); 2795c6c1daeSBarry Smith PetscValidType(rnd, 1); 28048a46eb9SPierre Jolivet if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)rnd), &viewer)); 2815c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 2825c6c1daeSBarry Smith PetscCheckSameComm(rnd, 1, viewer, 2); 283*9f196a02SMartin Diehl PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 284e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 2859566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSAWS, &issaws)); 286f05ece33SBarry Smith #endif 287*9f196a02SMartin Diehl if (isascii) { 2885c6c1daeSBarry Smith PetscMPIInt rank; 2899566063dSJacob Faibussowitsch PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)rnd, viewer)); 2909566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)rnd), &rank)); 2919566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushSynchronized(viewer)); 2929566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Random type %s, seed %lu\n", rank, ((PetscObject)rnd)->type_name, rnd->seed)); 2939566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(viewer)); 2949566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopSynchronized(viewer)); 295e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 296536b137fSBarry Smith } else if (issaws) { 297d45a07a7SBarry Smith PetscMPIInt rank; 2982657e9d9SBarry Smith const char *name; 299d45a07a7SBarry Smith 3009566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)rnd, &name)); 3019566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 302dd400576SPatrick Sanan if (!((PetscObject)rnd)->amsmem && rank == 0) { 303d45a07a7SBarry Smith char dir[1024]; 304d45a07a7SBarry Smith 3059566063dSJacob Faibussowitsch PetscCall(PetscObjectViewSAWs((PetscObject)rnd, viewer)); 3069566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(dir, 1024, "/PETSc/Objects/%s/Low", name)); 307792fecdfSBarry Smith PetscCallSAWs(SAWs_Register, (dir, &rnd->low, 1, SAWs_READ, SAWs_DOUBLE)); 308f05ece33SBarry Smith } 309f05ece33SBarry Smith #endif 3105c6c1daeSBarry Smith } 3113ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3125c6c1daeSBarry Smith } 3135c6c1daeSBarry Smith 3145c6c1daeSBarry Smith /*@ 315c31d2375SBarry Smith PetscRandomCreate - Creates an object for generating random numbers, 3165c6c1daeSBarry Smith and initializes the random-number generator. 3175c6c1daeSBarry Smith 318d083f849SBarry Smith Collective 3195c6c1daeSBarry Smith 32067be906fSBarry Smith Input Parameter: 321dc424cfaSBarry Smith . comm - MPI communicator 3225c6c1daeSBarry Smith 3235c6c1daeSBarry Smith Output Parameter: 324c31d2375SBarry Smith . r - the random number generator object 3255c6c1daeSBarry Smith 3265c6c1daeSBarry Smith Level: intermediate 3275c6c1daeSBarry Smith 3285c6c1daeSBarry Smith Notes: 329811af0c4SBarry Smith The random type has to be set by `PetscRandomSetType()`. 3305c6c1daeSBarry Smith 3316aad120cSJose E. Roman This is only a primitive "parallel" random number generator, it should NOT 3325c6c1daeSBarry Smith be used for sophisticated parallel Monte Carlo methods since it will very likely 3335c6c1daeSBarry Smith not have the correct statistics across processors. You can provide your own 33467be906fSBarry Smith parallel generator using `PetscRandomRegister()`; 3355c6c1daeSBarry Smith 336811af0c4SBarry Smith If you create a `PetscRandom()` using `PETSC_COMM_SELF` on several processors then 337811af0c4SBarry Smith the SAME random numbers will be generated on all those processors. Use `PETSC_COMM_WORLD` 3385c6c1daeSBarry Smith or the appropriate parallel communicator to eliminate this issue. 3395c6c1daeSBarry Smith 340811af0c4SBarry Smith Use `VecSetRandom()` to set the elements of a vector to random numbers. 3415c6c1daeSBarry Smith 3425c6c1daeSBarry Smith Example of Usage: 3435c6c1daeSBarry Smith .vb 3445c6c1daeSBarry Smith PetscRandomCreate(PETSC_COMM_SELF,&r); 3455c6c1daeSBarry Smith PetscRandomSetType(r,PETSCRAND48); 3465c6c1daeSBarry Smith PetscRandomGetValue(r,&value1); 3475c6c1daeSBarry Smith PetscRandomGetValueReal(r,&value2); 3485c6c1daeSBarry Smith PetscRandomDestroy(&r); 3495c6c1daeSBarry Smith .ve 3505c6c1daeSBarry Smith 351db781477SPatrick Sanan .seealso: `PetscRandomSetType()`, `PetscRandomGetValue()`, `PetscRandomGetValueReal()`, `PetscRandomSetInterval()`, 352811af0c4SBarry Smith `PetscRandomDestroy()`, `VecSetRandom()`, `PetscRandomType`, `PetscRandom` 3535c6c1daeSBarry Smith @*/ 354d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomCreate(MPI_Comm comm, PetscRandom *r) 355d71ae5a4SJacob Faibussowitsch { 3565c6c1daeSBarry Smith PetscRandom rr; 3575c6c1daeSBarry Smith PetscMPIInt rank; 3585c6c1daeSBarry Smith 3595c6c1daeSBarry Smith PetscFunctionBegin; 3604f572ea9SToby Isaac PetscAssertPointer(r, 2); 3619566063dSJacob Faibussowitsch PetscCall(PetscRandomInitializePackage()); 3625c6c1daeSBarry Smith 3639566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(rr, PETSC_RANDOM_CLASSID, "PetscRandom", "Random number generator", "Sys", comm, PetscRandomDestroy, PetscRandomView)); 3649566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 3650298fd71SBarry Smith rr->data = NULL; 3665c6c1daeSBarry Smith rr->low = 0.0; 3675c6c1daeSBarry Smith rr->width = 1.0; 3685c6c1daeSBarry Smith rr->iset = PETSC_FALSE; 3695c6c1daeSBarry Smith rr->seed = 0x12345678 + 76543 * rank; 3709566063dSJacob Faibussowitsch PetscCall(PetscRandomSetType(rr, PETSCRANDER48)); 3715c6c1daeSBarry Smith *r = rr; 3723ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3735c6c1daeSBarry Smith } 3745c6c1daeSBarry Smith 3755c6c1daeSBarry Smith /*@ 376811af0c4SBarry Smith PetscRandomSeed - Seed the random number generator. 3775c6c1daeSBarry Smith 3785c6c1daeSBarry Smith Not collective 3795c6c1daeSBarry Smith 3802fe279fdSBarry Smith Input Parameter: 3815c6c1daeSBarry Smith . r - The random number generator context 3825c6c1daeSBarry Smith 3835c6c1daeSBarry Smith Level: intermediate 3845c6c1daeSBarry Smith 38510450e9eSJacob Faibussowitsch Example Usage: 386811af0c4SBarry Smith .vb 3875c6c1daeSBarry Smith PetscRandomSetSeed(r,a positive integer); 388811af0c4SBarry Smith PetscRandomSeed(r); 389811af0c4SBarry Smith PetscRandomGetValue() will now start with the new seed. 3905c6c1daeSBarry Smith 3915c6c1daeSBarry Smith PetscRandomSeed(r) without a call to PetscRandomSetSeed() re-initializes 3925c6c1daeSBarry Smith the seed. The random numbers generated will be the same as before. 393811af0c4SBarry Smith .ve 3945c6c1daeSBarry Smith 395db781477SPatrick Sanan .seealso: `PetscRandomCreate()`, `PetscRandomGetSeed()`, `PetscRandomSetSeed()` 3965c6c1daeSBarry Smith @*/ 397d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomSeed(PetscRandom r) 398d71ae5a4SJacob Faibussowitsch { 3995c6c1daeSBarry Smith PetscFunctionBegin; 4005c6c1daeSBarry Smith PetscValidHeaderSpecific(r, PETSC_RANDOM_CLASSID, 1); 4015c6c1daeSBarry Smith PetscValidType(r, 1); 4025c6c1daeSBarry Smith 403dbbe0bcdSBarry Smith PetscUseTypeMethod(r, seed); 4049566063dSJacob Faibussowitsch PetscCall(PetscObjectStateIncrease((PetscObject)r)); 4053ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4065c6c1daeSBarry Smith } 407