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 @*/
PetscRandomDestroy(PetscRandom * r)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 @*/
PetscRandomGetSeed(PetscRandom r,PetscInt64 * seed)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 @*/
PetscRandomSetSeed(PetscRandom r,PetscInt64 seed)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 PetscRandomSetTypeFromOptions_Private - Sets the type of random generator from user options. Defaults to type PETSCRAND48 or PETSCRAND.
1065c6c1daeSBarry Smith
107c3339decSBarry Smith Collective
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 */
PetscRandomSetTypeFromOptions_Private(PetscRandom rnd,PetscOptionItems PetscOptionsObject)116ce78bad3SBarry Smith static PetscErrorCode PetscRandomSetTypeFromOptions_Private(PetscRandom rnd, PetscOptionItems PetscOptionsObject)
117d71ae5a4SJacob Faibussowitsch {
1185c6c1daeSBarry Smith PetscBool opt;
1195c6c1daeSBarry Smith const char *defaultType;
1205c6c1daeSBarry Smith char typeName[256];
1215c6c1daeSBarry Smith
1225c6c1daeSBarry Smith PetscFunctionBegin;
1235c6c1daeSBarry Smith if (((PetscObject)rnd)->type_name) {
1245c6c1daeSBarry Smith defaultType = ((PetscObject)rnd)->type_name;
1255c6c1daeSBarry Smith } else {
126b3bd51deSBarry Smith defaultType = PETSCRANDER48;
1275c6c1daeSBarry Smith }
1285c6c1daeSBarry Smith
1299566063dSJacob Faibussowitsch PetscCall(PetscRandomRegisterAll());
1309566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-random_type", "PetscRandom type", "PetscRandomSetType", PetscRandomList, defaultType, typeName, 256, &opt));
1315c6c1daeSBarry Smith if (opt) {
1329566063dSJacob Faibussowitsch PetscCall(PetscRandomSetType(rnd, typeName));
1335c6c1daeSBarry Smith } else {
1349566063dSJacob Faibussowitsch PetscCall(PetscRandomSetType(rnd, defaultType));
1355c6c1daeSBarry Smith }
1363ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1375c6c1daeSBarry Smith }
1385c6c1daeSBarry Smith
1395c6c1daeSBarry Smith /*@
1405c6c1daeSBarry Smith PetscRandomSetFromOptions - Configures the random number generator from the options database.
1415c6c1daeSBarry Smith
142c3339decSBarry Smith Collective
1435c6c1daeSBarry Smith
1445c6c1daeSBarry Smith Input Parameter:
1455c6c1daeSBarry Smith . rnd - The random number generator context
1465c6c1daeSBarry Smith
147811af0c4SBarry Smith Options Database Keys:
148da81f932SPierre Jolivet + -random_seed <integer> - provide a seed to the random number generator
14914a9496bSBarry Smith - -random_no_imaginary_part - makes the imaginary part of the random number zero, this is useful when you want the
15014a9496bSBarry Smith same code to produce the same result when run with real numbers or complex numbers for regression testing purposes
1515c6c1daeSBarry Smith
152c31d2375SBarry Smith Level: beginner
153c31d2375SBarry Smith
154811af0c4SBarry Smith Note:
155811af0c4SBarry Smith Must be called after `PetscRandomCreate()` but before the rnd is used.
1565c6c1daeSBarry Smith
157811af0c4SBarry Smith .seealso: `PetscRandom`, `PetscRandomCreate()`, `PetscRandomSetType()`
1585c6c1daeSBarry Smith @*/
PetscRandomSetFromOptions(PetscRandom rnd)159d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomSetFromOptions(PetscRandom rnd)
160d71ae5a4SJacob Faibussowitsch {
16114a9496bSBarry Smith PetscBool set, noimaginary = PETSC_FALSE;
1625c6c1daeSBarry Smith PetscInt seed;
1635c6c1daeSBarry Smith
1645c6c1daeSBarry Smith PetscFunctionBegin;
1655c6c1daeSBarry Smith PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID, 1);
1665c6c1daeSBarry Smith
167d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)rnd);
1685c6c1daeSBarry Smith
1695c6c1daeSBarry Smith /* Handle PetscRandom type options */
170dbbe0bcdSBarry Smith PetscCall(PetscRandomSetTypeFromOptions_Private(rnd, PetscOptionsObject));
1715c6c1daeSBarry Smith
1725c6c1daeSBarry Smith /* Handle specific random generator's options */
173dbbe0bcdSBarry Smith PetscTryTypeMethod(rnd, setfromoptions, PetscOptionsObject);
1749566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-random_seed", "Seed to use to generate random numbers", "PetscRandomSetSeed", 0, &seed, &set));
1755c6c1daeSBarry Smith if (set) {
1769566063dSJacob Faibussowitsch PetscCall(PetscRandomSetSeed(rnd, (unsigned long int)seed));
1779566063dSJacob Faibussowitsch PetscCall(PetscRandomSeed(rnd));
1785c6c1daeSBarry Smith }
1799566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-random_no_imaginary_part", "The imaginary part of the random number will be zero", "PetscRandomSetInterval", noimaginary, &noimaginary, &set));
18014a9496bSBarry Smith #if defined(PETSC_HAVE_COMPLEX)
18114a9496bSBarry Smith if (set) {
18214a9496bSBarry Smith if (noimaginary) {
18314a9496bSBarry Smith PetscScalar low, high;
1849566063dSJacob Faibussowitsch PetscCall(PetscRandomGetInterval(rnd, &low, &high));
18514a9496bSBarry Smith low = low - PetscImaginaryPart(low);
18614a9496bSBarry Smith high = high - PetscImaginaryPart(high);
1879566063dSJacob Faibussowitsch PetscCall(PetscRandomSetInterval(rnd, low, high));
18814a9496bSBarry Smith }
18914a9496bSBarry Smith }
19014a9496bSBarry Smith #endif
191d0609cedSBarry Smith PetscOptionsEnd();
1929566063dSJacob Faibussowitsch PetscCall(PetscRandomViewFromOptions(rnd, NULL, "-random_view"));
1933ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1945c6c1daeSBarry Smith }
1955c6c1daeSBarry Smith
19644ffe595SStefano Zampini /*@
19744ffe595SStefano Zampini PetscRandomSetOptionsPrefix - Sets the prefix used for searching for all
19844ffe595SStefano Zampini `PetscRandom` options in the database.
19944ffe595SStefano Zampini
20044ffe595SStefano Zampini Logically Collective
20144ffe595SStefano Zampini
20244ffe595SStefano Zampini Input Parameters:
20344ffe595SStefano Zampini + r - the random number generator context
20444ffe595SStefano Zampini - prefix - the prefix to prepend to all option names
20544ffe595SStefano Zampini
20644ffe595SStefano Zampini Level: advanced
20744ffe595SStefano Zampini
20844ffe595SStefano Zampini Note:
20944ffe595SStefano Zampini A hyphen (-) must NOT be given at the beginning of the prefix name.
21044ffe595SStefano Zampini The first character of all runtime options is AUTOMATICALLY the hyphen.
21144ffe595SStefano Zampini
21244ffe595SStefano Zampini .seealso: `PetscRandom`, `PetscRandomSetFromOptions()`
21344ffe595SStefano Zampini @*/
PetscRandomSetOptionsPrefix(PetscRandom r,const char prefix[])21444ffe595SStefano Zampini PetscErrorCode PetscRandomSetOptionsPrefix(PetscRandom r, const char prefix[])
21544ffe595SStefano Zampini {
21644ffe595SStefano Zampini PetscFunctionBegin;
21744ffe595SStefano Zampini PetscValidHeaderSpecific(r, PETSC_RANDOM_CLASSID, 1);
21844ffe595SStefano Zampini PetscCall(PetscObjectSetOptionsPrefix((PetscObject)r, prefix));
21944ffe595SStefano Zampini PetscFunctionReturn(PETSC_SUCCESS);
22044ffe595SStefano Zampini }
22144ffe595SStefano Zampini
222e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
223e04113cfSBarry Smith #include <petscviewersaws.h>
224f05ece33SBarry Smith #endif
225fe2efc57SMark
226ffeef943SBarry Smith /*@
227811af0c4SBarry Smith PetscRandomViewFromOptions - View a `PetscRandom` object based on the options database
228fe2efc57SMark
229c3339decSBarry Smith Collective
230fe2efc57SMark
231fe2efc57SMark Input Parameters:
232fe2efc57SMark + A - the random number generator context
233736c3998SJose E. Roman . obj - Optional object
234736c3998SJose E. Roman - name - command line option
235fe2efc57SMark
236fe2efc57SMark Level: intermediate
237aec76313SJacob Faibussowitsch
238db781477SPatrick Sanan .seealso: `PetscRandom`, `PetscRandomView`, `PetscObjectViewFromOptions()`, `PetscRandomCreate()`
239fe2efc57SMark @*/
PetscRandomViewFromOptions(PetscRandom A,PetscObject obj,const char name[])240d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomViewFromOptions(PetscRandom A, PetscObject obj, const char name[])
241d71ae5a4SJacob Faibussowitsch {
242fe2efc57SMark PetscFunctionBegin;
243fe2efc57SMark PetscValidHeaderSpecific(A, PETSC_RANDOM_CLASSID, 1);
2449566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name));
2453ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
246fe2efc57SMark }
247fe2efc57SMark
248ffeef943SBarry Smith /*@
2495c6c1daeSBarry Smith PetscRandomView - Views a random number generator object.
2505c6c1daeSBarry Smith
251c3339decSBarry Smith Collective
2525c6c1daeSBarry Smith
2535c6c1daeSBarry Smith Input Parameters:
2545c6c1daeSBarry Smith + rnd - The random number generator context
2555c6c1daeSBarry Smith - viewer - an optional visualization context
2565c6c1daeSBarry Smith
257c31d2375SBarry Smith Level: beginner
258c31d2375SBarry Smith
259811af0c4SBarry Smith Note:
2605c6c1daeSBarry Smith The available visualization contexts include
261811af0c4SBarry Smith + `PETSC_VIEWER_STDOUT_SELF` - standard output (default)
262811af0c4SBarry Smith - `PETSC_VIEWER_STDOUT_WORLD` - synchronized standard
2635c6c1daeSBarry Smith output where only the first processor opens
2645c6c1daeSBarry Smith the file. All other processors send their
2655c6c1daeSBarry Smith data to the first processor to print.
2665c6c1daeSBarry Smith
267811af0c4SBarry Smith .seealso: `PetscRandom`, `PetscRealView()`, `PetscScalarView()`, `PetscIntView()`
2685c6c1daeSBarry Smith @*/
PetscRandomView(PetscRandom rnd,PetscViewer viewer)269d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomView(PetscRandom rnd, PetscViewer viewer)
270d71ae5a4SJacob Faibussowitsch {
271*9f196a02SMartin Diehl PetscBool isascii;
272e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
273536b137fSBarry Smith PetscBool issaws;
274f05ece33SBarry Smith #endif
2755c6c1daeSBarry Smith
2765c6c1daeSBarry Smith PetscFunctionBegin;
2775c6c1daeSBarry Smith PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID, 1);
2785c6c1daeSBarry Smith PetscValidType(rnd, 1);
27948a46eb9SPierre Jolivet if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)rnd), &viewer));
2805c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
2815c6c1daeSBarry Smith PetscCheckSameComm(rnd, 1, viewer, 2);
282*9f196a02SMartin Diehl PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
283e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
2849566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSAWS, &issaws));
285f05ece33SBarry Smith #endif
286*9f196a02SMartin Diehl if (isascii) {
2875c6c1daeSBarry Smith PetscMPIInt rank;
2889566063dSJacob Faibussowitsch PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)rnd, viewer));
2899566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)rnd), &rank));
2909566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushSynchronized(viewer));
2919566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Random type %s, seed %lu\n", rank, ((PetscObject)rnd)->type_name, rnd->seed));
2929566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(viewer));
2939566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopSynchronized(viewer));
294e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
295536b137fSBarry Smith } else if (issaws) {
296d45a07a7SBarry Smith PetscMPIInt rank;
2972657e9d9SBarry Smith const char *name;
298d45a07a7SBarry Smith
2999566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)rnd, &name));
3009566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
301dd400576SPatrick Sanan if (!((PetscObject)rnd)->amsmem && rank == 0) {
302d45a07a7SBarry Smith char dir[1024];
303d45a07a7SBarry Smith
3049566063dSJacob Faibussowitsch PetscCall(PetscObjectViewSAWs((PetscObject)rnd, viewer));
3059566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(dir, 1024, "/PETSc/Objects/%s/Low", name));
306792fecdfSBarry Smith PetscCallSAWs(SAWs_Register, (dir, &rnd->low, 1, SAWs_READ, SAWs_DOUBLE));
307f05ece33SBarry Smith }
308f05ece33SBarry Smith #endif
3095c6c1daeSBarry Smith }
3103ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
3115c6c1daeSBarry Smith }
3125c6c1daeSBarry Smith
3135c6c1daeSBarry Smith /*@
314c31d2375SBarry Smith PetscRandomCreate - Creates an object for generating random numbers,
3155c6c1daeSBarry Smith and initializes the random-number generator.
3165c6c1daeSBarry Smith
317d083f849SBarry Smith Collective
3185c6c1daeSBarry Smith
31967be906fSBarry Smith Input Parameter:
320dc424cfaSBarry Smith . comm - MPI communicator
3215c6c1daeSBarry Smith
3225c6c1daeSBarry Smith Output Parameter:
323c31d2375SBarry Smith . r - the random number generator object
3245c6c1daeSBarry Smith
3255c6c1daeSBarry Smith Level: intermediate
3265c6c1daeSBarry Smith
3275c6c1daeSBarry Smith Notes:
328811af0c4SBarry Smith The random type has to be set by `PetscRandomSetType()`.
3295c6c1daeSBarry Smith
3306aad120cSJose E. Roman This is only a primitive "parallel" random number generator, it should NOT
3315c6c1daeSBarry Smith be used for sophisticated parallel Monte Carlo methods since it will very likely
3325c6c1daeSBarry Smith not have the correct statistics across processors. You can provide your own
33367be906fSBarry Smith parallel generator using `PetscRandomRegister()`;
3345c6c1daeSBarry Smith
335811af0c4SBarry Smith If you create a `PetscRandom()` using `PETSC_COMM_SELF` on several processors then
336811af0c4SBarry Smith the SAME random numbers will be generated on all those processors. Use `PETSC_COMM_WORLD`
3375c6c1daeSBarry Smith or the appropriate parallel communicator to eliminate this issue.
3385c6c1daeSBarry Smith
339811af0c4SBarry Smith Use `VecSetRandom()` to set the elements of a vector to random numbers.
3405c6c1daeSBarry Smith
3415c6c1daeSBarry Smith Example of Usage:
3425c6c1daeSBarry Smith .vb
3435c6c1daeSBarry Smith PetscRandomCreate(PETSC_COMM_SELF,&r);
3445c6c1daeSBarry Smith PetscRandomSetType(r,PETSCRAND48);
3455c6c1daeSBarry Smith PetscRandomGetValue(r,&value1);
3465c6c1daeSBarry Smith PetscRandomGetValueReal(r,&value2);
3475c6c1daeSBarry Smith PetscRandomDestroy(&r);
3485c6c1daeSBarry Smith .ve
3495c6c1daeSBarry Smith
350db781477SPatrick Sanan .seealso: `PetscRandomSetType()`, `PetscRandomGetValue()`, `PetscRandomGetValueReal()`, `PetscRandomSetInterval()`,
351811af0c4SBarry Smith `PetscRandomDestroy()`, `VecSetRandom()`, `PetscRandomType`, `PetscRandom`
3525c6c1daeSBarry Smith @*/
PetscRandomCreate(MPI_Comm comm,PetscRandom * r)353d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomCreate(MPI_Comm comm, PetscRandom *r)
354d71ae5a4SJacob Faibussowitsch {
3555c6c1daeSBarry Smith PetscRandom rr;
3565c6c1daeSBarry Smith PetscMPIInt rank;
3575c6c1daeSBarry Smith
3585c6c1daeSBarry Smith PetscFunctionBegin;
3594f572ea9SToby Isaac PetscAssertPointer(r, 2);
3609566063dSJacob Faibussowitsch PetscCall(PetscRandomInitializePackage());
3615c6c1daeSBarry Smith
3629566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(rr, PETSC_RANDOM_CLASSID, "PetscRandom", "Random number generator", "Sys", comm, PetscRandomDestroy, PetscRandomView));
3639566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank));
3640298fd71SBarry Smith rr->data = NULL;
3655c6c1daeSBarry Smith rr->low = 0.0;
3665c6c1daeSBarry Smith rr->width = 1.0;
3675c6c1daeSBarry Smith rr->iset = PETSC_FALSE;
3685c6c1daeSBarry Smith rr->seed = 0x12345678 + 76543 * rank;
3699566063dSJacob Faibussowitsch PetscCall(PetscRandomSetType(rr, PETSCRANDER48));
3705c6c1daeSBarry Smith *r = rr;
3713ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
3725c6c1daeSBarry Smith }
3735c6c1daeSBarry Smith
3745c6c1daeSBarry Smith /*@
375811af0c4SBarry Smith PetscRandomSeed - Seed the random number generator.
3765c6c1daeSBarry Smith
3775c6c1daeSBarry Smith Not collective
3785c6c1daeSBarry Smith
3792fe279fdSBarry Smith Input Parameter:
3805c6c1daeSBarry Smith . r - The random number generator context
3815c6c1daeSBarry Smith
3825c6c1daeSBarry Smith Level: intermediate
3835c6c1daeSBarry Smith
38410450e9eSJacob Faibussowitsch Example Usage:
385811af0c4SBarry Smith .vb
3865c6c1daeSBarry Smith PetscRandomSetSeed(r,a positive integer);
387811af0c4SBarry Smith PetscRandomSeed(r);
388811af0c4SBarry Smith PetscRandomGetValue() will now start with the new seed.
3895c6c1daeSBarry Smith
3905c6c1daeSBarry Smith PetscRandomSeed(r) without a call to PetscRandomSetSeed() re-initializes
3915c6c1daeSBarry Smith the seed. The random numbers generated will be the same as before.
392811af0c4SBarry Smith .ve
3935c6c1daeSBarry Smith
394db781477SPatrick Sanan .seealso: `PetscRandomCreate()`, `PetscRandomGetSeed()`, `PetscRandomSetSeed()`
3955c6c1daeSBarry Smith @*/
PetscRandomSeed(PetscRandom r)396d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomSeed(PetscRandom r)
397d71ae5a4SJacob Faibussowitsch {
3985c6c1daeSBarry Smith PetscFunctionBegin;
3995c6c1daeSBarry Smith PetscValidHeaderSpecific(r, PETSC_RANDOM_CLASSID, 1);
4005c6c1daeSBarry Smith PetscValidType(r, 1);
4015c6c1daeSBarry Smith
402dbbe0bcdSBarry Smith PetscUseTypeMethod(r, seed);
4039566063dSJacob Faibussowitsch PetscCall(PetscObjectStateIncrease((PetscObject)r));
4043ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
4055c6c1daeSBarry Smith }
406