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