xref: /petsc/src/sys/classes/random/interface/randomc.c (revision 9f196a0264fbaf0568fead3a30c861c7ae4cf663)
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