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 23811af0c4SBarry Smith `PetscRandomCreate()`. 245c6c1daeSBarry Smith 25*c3339decSBarry Smith Collective 265c6c1daeSBarry Smith 2701d2d390SJose E. Roman Input Parameter: 285c6c1daeSBarry Smith . r - the random number generator context 295c6c1daeSBarry Smith 305c6c1daeSBarry Smith Level: intermediate 315c6c1daeSBarry Smith 32811af0c4SBarry Smith .seealso: `PetscRandom`, `PetscRandomGetValue()`, `PetscRandomCreate()`, `VecSetRandom()` 335c6c1daeSBarry Smith @*/ 34d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomDestroy(PetscRandom *r) 35d71ae5a4SJacob Faibussowitsch { 365c6c1daeSBarry Smith PetscFunctionBegin; 375c6c1daeSBarry Smith if (!*r) PetscFunctionReturn(0); 385c6c1daeSBarry Smith PetscValidHeaderSpecific(*r, PETSC_RANDOM_CLASSID, 1); 399371c9d4SSatish Balay if (--((PetscObject)(*r))->refct > 0) { 409371c9d4SSatish Balay *r = NULL; 419371c9d4SSatish Balay PetscFunctionReturn(0); 42e4e5cec9SBarry Smith } 4348a46eb9SPierre Jolivet if ((*r)->ops->destroy) PetscCall((*(*r)->ops->destroy)(*r)); 449566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(r)); 455c6c1daeSBarry Smith PetscFunctionReturn(0); 465c6c1daeSBarry Smith } 475c6c1daeSBarry Smith 48e8976759SBarry Smith /*@C 495c6c1daeSBarry Smith PetscRandomGetSeed - Gets the random seed. 505c6c1daeSBarry Smith 515c6c1daeSBarry Smith Not collective 525c6c1daeSBarry Smith 535c6c1daeSBarry Smith Input Parameters: 545c6c1daeSBarry Smith . r - The random number generator context 555c6c1daeSBarry Smith 565c6c1daeSBarry Smith Output Parameter: 575c6c1daeSBarry Smith . seed - The random seed 585c6c1daeSBarry Smith 595c6c1daeSBarry Smith Level: intermediate 605c6c1daeSBarry Smith 61811af0c4SBarry Smith .seealso: `PetscRandom`, `PetscRandomCreate()`, `PetscRandomSetSeed()`, `PetscRandomSeed()` 625c6c1daeSBarry Smith @*/ 63d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomGetSeed(PetscRandom r, unsigned long *seed) 64d71ae5a4SJacob Faibussowitsch { 655c6c1daeSBarry Smith PetscFunctionBegin; 665c6c1daeSBarry Smith PetscValidHeaderSpecific(r, PETSC_RANDOM_CLASSID, 1); 675c6c1daeSBarry Smith if (seed) { 685c6c1daeSBarry Smith PetscValidPointer(seed, 2); 695c6c1daeSBarry Smith *seed = r->seed; 705c6c1daeSBarry Smith } 715c6c1daeSBarry Smith PetscFunctionReturn(0); 725c6c1daeSBarry Smith } 735c6c1daeSBarry Smith 74e8976759SBarry Smith /*@C 75811af0c4SBarry Smith PetscRandomSetSeed - Sets the random seed. You MUST call `PetscRandomSeed()` after this call to have the new seed used. 765c6c1daeSBarry Smith 775c6c1daeSBarry Smith Not collective 785c6c1daeSBarry Smith 795c6c1daeSBarry Smith Input Parameters: 805c6c1daeSBarry Smith + r - The random number generator context 815c6c1daeSBarry Smith - seed - The random seed 825c6c1daeSBarry Smith 835c6c1daeSBarry Smith Level: intermediate 845c6c1daeSBarry Smith 855c6c1daeSBarry Smith Usage: 86811af0c4SBarry Smith .vb 875c6c1daeSBarry Smith PetscRandomSetSeed(r,a positive integer); 88811af0c4SBarry Smith PetscRandomSeed(r); 89811af0c4SBarry Smith PetscRandomGetValue() will now start with the new seed. 905c6c1daeSBarry Smith 915c6c1daeSBarry Smith PetscRandomSeed(r) without a call to PetscRandomSetSeed() re-initializes 925c6c1daeSBarry Smith the seed. The random numbers generated will be the same as before. 93811af0c4SBarry Smith .ve 945c6c1daeSBarry Smith 95811af0c4SBarry Smith .seealso: `PetscRandom`, `PetscRandomCreate()`, `PetscRandomGetSeed()`, `PetscRandomSeed()` 965c6c1daeSBarry Smith @*/ 97d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomSetSeed(PetscRandom r, unsigned long seed) 98d71ae5a4SJacob Faibussowitsch { 995c6c1daeSBarry Smith PetscFunctionBegin; 1005c6c1daeSBarry Smith PetscValidHeaderSpecific(r, PETSC_RANDOM_CLASSID, 1); 1015c6c1daeSBarry Smith r->seed = seed; 1029566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Setting seed to %d\n", (int)seed)); 1035c6c1daeSBarry Smith PetscFunctionReturn(0); 1045c6c1daeSBarry Smith } 1055c6c1daeSBarry Smith 1065c6c1daeSBarry Smith /* ------------------------------------------------------------------- */ 1075c6c1daeSBarry Smith /* 1085c6c1daeSBarry Smith PetscRandomSetTypeFromOptions_Private - Sets the type of random generator from user options. Defaults to type PETSCRAND48 or PETSCRAND. 1095c6c1daeSBarry Smith 110*c3339decSBarry Smith Collective 1115c6c1daeSBarry Smith 1125c6c1daeSBarry Smith Input Parameter: 1135c6c1daeSBarry Smith . rnd - The random number generator context 1145c6c1daeSBarry Smith 1155c6c1daeSBarry Smith Level: intermediate 1165c6c1daeSBarry Smith 117db781477SPatrick Sanan .seealso: `PetscRandomSetFromOptions()`, `PetscRandomSetType()` 1185c6c1daeSBarry Smith */ 119d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscRandomSetTypeFromOptions_Private(PetscRandom rnd, PetscOptionItems *PetscOptionsObject) 120d71ae5a4SJacob Faibussowitsch { 1215c6c1daeSBarry Smith PetscBool opt; 1225c6c1daeSBarry Smith const char *defaultType; 1235c6c1daeSBarry Smith char typeName[256]; 1245c6c1daeSBarry Smith 1255c6c1daeSBarry Smith PetscFunctionBegin; 1265c6c1daeSBarry Smith if (((PetscObject)rnd)->type_name) { 1275c6c1daeSBarry Smith defaultType = ((PetscObject)rnd)->type_name; 1285c6c1daeSBarry Smith } else { 129b3bd51deSBarry Smith defaultType = PETSCRANDER48; 1305c6c1daeSBarry Smith } 1315c6c1daeSBarry Smith 1329566063dSJacob Faibussowitsch PetscCall(PetscRandomRegisterAll()); 1339566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-random_type", "PetscRandom type", "PetscRandomSetType", PetscRandomList, defaultType, typeName, 256, &opt)); 1345c6c1daeSBarry Smith if (opt) { 1359566063dSJacob Faibussowitsch PetscCall(PetscRandomSetType(rnd, typeName)); 1365c6c1daeSBarry Smith } else { 1379566063dSJacob Faibussowitsch PetscCall(PetscRandomSetType(rnd, defaultType)); 1385c6c1daeSBarry Smith } 1395c6c1daeSBarry Smith PetscFunctionReturn(0); 1405c6c1daeSBarry Smith } 1415c6c1daeSBarry Smith 1425c6c1daeSBarry Smith /*@ 1435c6c1daeSBarry Smith PetscRandomSetFromOptions - Configures the random number generator from the options database. 1445c6c1daeSBarry Smith 145*c3339decSBarry Smith Collective 1465c6c1daeSBarry Smith 1475c6c1daeSBarry Smith Input Parameter: 1485c6c1daeSBarry Smith . rnd - The random number generator context 1495c6c1daeSBarry Smith 150811af0c4SBarry Smith Options Database Keys: 15114a9496bSBarry Smith + -random_seed <integer> - provide a seed to the random number generater 15214a9496bSBarry Smith - -random_no_imaginary_part - makes the imaginary part of the random number zero, this is useful when you want the 15314a9496bSBarry Smith same code to produce the same result when run with real numbers or complex numbers for regression testing purposes 1545c6c1daeSBarry Smith 155811af0c4SBarry Smith Note: 156811af0c4SBarry Smith Must be called after `PetscRandomCreate()` but before the rnd is used. 1575c6c1daeSBarry Smith 1585c6c1daeSBarry Smith Level: beginner 1595c6c1daeSBarry Smith 160811af0c4SBarry Smith .seealso: `PetscRandom`, `PetscRandomCreate()`, `PetscRandomSetType()` 1615c6c1daeSBarry Smith @*/ 162d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomSetFromOptions(PetscRandom rnd) 163d71ae5a4SJacob Faibussowitsch { 16414a9496bSBarry Smith PetscBool set, noimaginary = PETSC_FALSE; 1655c6c1daeSBarry Smith PetscInt seed; 1665c6c1daeSBarry Smith 1675c6c1daeSBarry Smith PetscFunctionBegin; 1685c6c1daeSBarry Smith PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID, 1); 1695c6c1daeSBarry Smith 170d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)rnd); 1715c6c1daeSBarry Smith 1725c6c1daeSBarry Smith /* Handle PetscRandom type options */ 173dbbe0bcdSBarry Smith PetscCall(PetscRandomSetTypeFromOptions_Private(rnd, PetscOptionsObject)); 1745c6c1daeSBarry Smith 1755c6c1daeSBarry Smith /* Handle specific random generator's options */ 176dbbe0bcdSBarry Smith PetscTryTypeMethod(rnd, setfromoptions, PetscOptionsObject); 1779566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-random_seed", "Seed to use to generate random numbers", "PetscRandomSetSeed", 0, &seed, &set)); 1785c6c1daeSBarry Smith if (set) { 1799566063dSJacob Faibussowitsch PetscCall(PetscRandomSetSeed(rnd, (unsigned long int)seed)); 1809566063dSJacob Faibussowitsch PetscCall(PetscRandomSeed(rnd)); 1815c6c1daeSBarry Smith } 1829566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-random_no_imaginary_part", "The imaginary part of the random number will be zero", "PetscRandomSetInterval", noimaginary, &noimaginary, &set)); 18314a9496bSBarry Smith #if defined(PETSC_HAVE_COMPLEX) 18414a9496bSBarry Smith if (set) { 18514a9496bSBarry Smith if (noimaginary) { 18614a9496bSBarry Smith PetscScalar low, high; 1879566063dSJacob Faibussowitsch PetscCall(PetscRandomGetInterval(rnd, &low, &high)); 18814a9496bSBarry Smith low = low - PetscImaginaryPart(low); 18914a9496bSBarry Smith high = high - PetscImaginaryPart(high); 1909566063dSJacob Faibussowitsch PetscCall(PetscRandomSetInterval(rnd, low, high)); 19114a9496bSBarry Smith } 19214a9496bSBarry Smith } 19314a9496bSBarry Smith #endif 194d0609cedSBarry Smith PetscOptionsEnd(); 1959566063dSJacob Faibussowitsch PetscCall(PetscRandomViewFromOptions(rnd, NULL, "-random_view")); 1965c6c1daeSBarry Smith PetscFunctionReturn(0); 1975c6c1daeSBarry Smith } 1985c6c1daeSBarry Smith 199e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 200e04113cfSBarry Smith #include <petscviewersaws.h> 201f05ece33SBarry Smith #endif 202fe2efc57SMark 203fe2efc57SMark /*@C 204811af0c4SBarry Smith PetscRandomViewFromOptions - View a `PetscRandom` object based on the options database 205fe2efc57SMark 206*c3339decSBarry Smith Collective 207fe2efc57SMark 208fe2efc57SMark Input Parameters: 209fe2efc57SMark + A - the random number generator context 210736c3998SJose E. Roman . obj - Optional object 211736c3998SJose E. Roman - name - command line option 212fe2efc57SMark 213fe2efc57SMark Level: intermediate 214db781477SPatrick Sanan .seealso: `PetscRandom`, `PetscRandomView`, `PetscObjectViewFromOptions()`, `PetscRandomCreate()` 215fe2efc57SMark @*/ 216d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomViewFromOptions(PetscRandom A, PetscObject obj, const char name[]) 217d71ae5a4SJacob Faibussowitsch { 218fe2efc57SMark PetscFunctionBegin; 219fe2efc57SMark PetscValidHeaderSpecific(A, PETSC_RANDOM_CLASSID, 1); 2209566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name)); 221fe2efc57SMark PetscFunctionReturn(0); 222fe2efc57SMark } 223fe2efc57SMark 2245c6c1daeSBarry Smith /*@C 2255c6c1daeSBarry Smith PetscRandomView - Views a random number generator object. 2265c6c1daeSBarry Smith 227*c3339decSBarry Smith Collective 2285c6c1daeSBarry Smith 2295c6c1daeSBarry Smith Input Parameters: 2305c6c1daeSBarry Smith + rnd - The random number generator context 2315c6c1daeSBarry Smith - viewer - an optional visualization context 2325c6c1daeSBarry Smith 233811af0c4SBarry Smith Note: 2345c6c1daeSBarry Smith The available visualization contexts include 235811af0c4SBarry Smith + `PETSC_VIEWER_STDOUT_SELF` - standard output (default) 236811af0c4SBarry Smith - `PETSC_VIEWER_STDOUT_WORLD` - synchronized standard 2375c6c1daeSBarry Smith output where only the first processor opens 2385c6c1daeSBarry Smith the file. All other processors send their 2395c6c1daeSBarry Smith data to the first processor to print. 2405c6c1daeSBarry Smith 2415c6c1daeSBarry Smith Level: beginner 2425c6c1daeSBarry Smith 243811af0c4SBarry Smith .seealso: `PetscRandom`, `PetscRealView()`, `PetscScalarView()`, `PetscIntView()` 2445c6c1daeSBarry Smith @*/ 245d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomView(PetscRandom rnd, PetscViewer viewer) 246d71ae5a4SJacob Faibussowitsch { 2475c6c1daeSBarry Smith PetscBool iascii; 248e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 249536b137fSBarry Smith PetscBool issaws; 250f05ece33SBarry Smith #endif 2515c6c1daeSBarry Smith 2525c6c1daeSBarry Smith PetscFunctionBegin; 2535c6c1daeSBarry Smith PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID, 1); 2545c6c1daeSBarry Smith PetscValidType(rnd, 1); 25548a46eb9SPierre Jolivet if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)rnd), &viewer)); 2565c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 2575c6c1daeSBarry Smith PetscCheckSameComm(rnd, 1, viewer, 2); 2589566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 259e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 2609566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSAWS, &issaws)); 261f05ece33SBarry Smith #endif 2625c6c1daeSBarry Smith if (iascii) { 2635c6c1daeSBarry Smith PetscMPIInt rank; 2649566063dSJacob Faibussowitsch PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)rnd, viewer)); 2659566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)rnd), &rank)); 2669566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushSynchronized(viewer)); 2679566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Random type %s, seed %lu\n", rank, ((PetscObject)rnd)->type_name, rnd->seed)); 2689566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(viewer)); 2699566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopSynchronized(viewer)); 270e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 271536b137fSBarry Smith } else if (issaws) { 272d45a07a7SBarry Smith PetscMPIInt rank; 2732657e9d9SBarry Smith const char *name; 274d45a07a7SBarry Smith 2759566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)rnd, &name)); 2769566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 277dd400576SPatrick Sanan if (!((PetscObject)rnd)->amsmem && rank == 0) { 278d45a07a7SBarry Smith char dir[1024]; 279d45a07a7SBarry Smith 2809566063dSJacob Faibussowitsch PetscCall(PetscObjectViewSAWs((PetscObject)rnd, viewer)); 2819566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(dir, 1024, "/PETSc/Objects/%s/Low", name)); 282792fecdfSBarry Smith PetscCallSAWs(SAWs_Register, (dir, &rnd->low, 1, SAWs_READ, SAWs_DOUBLE)); 283f05ece33SBarry Smith } 284f05ece33SBarry Smith #endif 2855c6c1daeSBarry Smith } 2865c6c1daeSBarry Smith PetscFunctionReturn(0); 2875c6c1daeSBarry Smith } 2885c6c1daeSBarry Smith 2895c6c1daeSBarry Smith /*@ 2905c6c1daeSBarry Smith PetscRandomCreate - Creates a context for generating random numbers, 2915c6c1daeSBarry Smith and initializes the random-number generator. 2925c6c1daeSBarry Smith 293d083f849SBarry Smith Collective 2945c6c1daeSBarry Smith 2955c6c1daeSBarry Smith Input Parameters: 296dc424cfaSBarry Smith . comm - MPI communicator 2975c6c1daeSBarry Smith 2985c6c1daeSBarry Smith Output Parameter: 2995c6c1daeSBarry Smith . r - the random number generator context 3005c6c1daeSBarry Smith 3015c6c1daeSBarry Smith Level: intermediate 3025c6c1daeSBarry Smith 3035c6c1daeSBarry Smith Notes: 304811af0c4SBarry Smith The random type has to be set by `PetscRandomSetType()`. 3055c6c1daeSBarry Smith 3066aad120cSJose E. Roman This is only a primitive "parallel" random number generator, it should NOT 3075c6c1daeSBarry Smith be used for sophisticated parallel Monte Carlo methods since it will very likely 3085c6c1daeSBarry Smith not have the correct statistics across processors. You can provide your own 3095c6c1daeSBarry Smith parallel generator using PetscRandomRegister(); 3105c6c1daeSBarry Smith 311811af0c4SBarry Smith If you create a `PetscRandom()` using `PETSC_COMM_SELF` on several processors then 312811af0c4SBarry Smith the SAME random numbers will be generated on all those processors. Use `PETSC_COMM_WORLD` 3135c6c1daeSBarry Smith or the appropriate parallel communicator to eliminate this issue. 3145c6c1daeSBarry Smith 315811af0c4SBarry Smith Use `VecSetRandom()` to set the elements of a vector to random numbers. 3165c6c1daeSBarry Smith 3175c6c1daeSBarry Smith Example of Usage: 3185c6c1daeSBarry Smith .vb 3195c6c1daeSBarry Smith PetscRandomCreate(PETSC_COMM_SELF,&r); 3205c6c1daeSBarry Smith PetscRandomSetType(r,PETSCRAND48); 3215c6c1daeSBarry Smith PetscRandomGetValue(r,&value1); 3225c6c1daeSBarry Smith PetscRandomGetValueReal(r,&value2); 3235c6c1daeSBarry Smith PetscRandomDestroy(&r); 3245c6c1daeSBarry Smith .ve 3255c6c1daeSBarry Smith 326db781477SPatrick Sanan .seealso: `PetscRandomSetType()`, `PetscRandomGetValue()`, `PetscRandomGetValueReal()`, `PetscRandomSetInterval()`, 327811af0c4SBarry Smith `PetscRandomDestroy()`, `VecSetRandom()`, `PetscRandomType`, `PetscRandom` 3285c6c1daeSBarry Smith @*/ 3295c6c1daeSBarry Smith 330d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomCreate(MPI_Comm comm, PetscRandom *r) 331d71ae5a4SJacob Faibussowitsch { 3325c6c1daeSBarry Smith PetscRandom rr; 3335c6c1daeSBarry Smith PetscMPIInt rank; 3345c6c1daeSBarry Smith 3355c6c1daeSBarry Smith PetscFunctionBegin; 336064a246eSJacob Faibussowitsch PetscValidPointer(r, 2); 3370298fd71SBarry Smith *r = NULL; 3389566063dSJacob Faibussowitsch PetscCall(PetscRandomInitializePackage()); 3395c6c1daeSBarry Smith 3409566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(rr, PETSC_RANDOM_CLASSID, "PetscRandom", "Random number generator", "Sys", comm, PetscRandomDestroy, PetscRandomView)); 3415c6c1daeSBarry Smith 3429566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 343a297a907SKarl Rupp 3440298fd71SBarry Smith rr->data = NULL; 3455c6c1daeSBarry Smith rr->low = 0.0; 3465c6c1daeSBarry Smith rr->width = 1.0; 3475c6c1daeSBarry Smith rr->iset = PETSC_FALSE; 3485c6c1daeSBarry Smith rr->seed = 0x12345678 + 76543 * rank; 3499566063dSJacob Faibussowitsch PetscCall(PetscRandomSetType(rr, PETSCRANDER48)); 3505c6c1daeSBarry Smith *r = rr; 3515c6c1daeSBarry Smith PetscFunctionReturn(0); 3525c6c1daeSBarry Smith } 3535c6c1daeSBarry Smith 3545c6c1daeSBarry Smith /*@ 355811af0c4SBarry Smith PetscRandomSeed - Seed the random number generator. 3565c6c1daeSBarry Smith 3575c6c1daeSBarry Smith Not collective 3585c6c1daeSBarry Smith 3595c6c1daeSBarry Smith Input Parameters: 3605c6c1daeSBarry Smith . r - The random number generator context 3615c6c1daeSBarry Smith 3625c6c1daeSBarry Smith Level: intermediate 3635c6c1daeSBarry Smith 3645c6c1daeSBarry Smith Usage: 365811af0c4SBarry Smith .vb 3665c6c1daeSBarry Smith PetscRandomSetSeed(r,a positive integer); 367811af0c4SBarry Smith PetscRandomSeed(r); 368811af0c4SBarry Smith PetscRandomGetValue() will now start with the new seed. 3695c6c1daeSBarry Smith 3705c6c1daeSBarry Smith PetscRandomSeed(r) without a call to PetscRandomSetSeed() re-initializes 3715c6c1daeSBarry Smith the seed. The random numbers generated will be the same as before. 372811af0c4SBarry Smith .ve 3735c6c1daeSBarry Smith 374db781477SPatrick Sanan .seealso: `PetscRandomCreate()`, `PetscRandomGetSeed()`, `PetscRandomSetSeed()` 3755c6c1daeSBarry Smith @*/ 376d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomSeed(PetscRandom r) 377d71ae5a4SJacob Faibussowitsch { 3785c6c1daeSBarry Smith PetscFunctionBegin; 3795c6c1daeSBarry Smith PetscValidHeaderSpecific(r, PETSC_RANDOM_CLASSID, 1); 3805c6c1daeSBarry Smith PetscValidType(r, 1); 3815c6c1daeSBarry Smith 382dbbe0bcdSBarry Smith PetscUseTypeMethod(r, seed); 3839566063dSJacob Faibussowitsch PetscCall(PetscObjectStateIncrease((PetscObject)r)); 3845c6c1daeSBarry Smith PetscFunctionReturn(0); 3855c6c1daeSBarry Smith } 386