xref: /petsc/src/sys/classes/random/interface/randomc.c (revision f4f49eeac7efa77fffa46b7ff95a3ed169f659ed)
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 
204a1c5f42SJose E. Roman /*@C
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);
37*f4f49eeaSPierre 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 @*/
61d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomGetSeed(PetscRandom r, unsigned long *seed)
62d71ae5a4SJacob Faibussowitsch {
635c6c1daeSBarry Smith   PetscFunctionBegin;
645c6c1daeSBarry Smith   PetscValidHeaderSpecific(r, PETSC_RANDOM_CLASSID, 1);
655c6c1daeSBarry Smith   if (seed) {
664f572ea9SToby Isaac     PetscAssertPointer(seed, 2);
675c6c1daeSBarry Smith     *seed = 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 @*/
95d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomSetSeed(PetscRandom r, unsigned long seed)
96d71ae5a4SJacob Faibussowitsch {
975c6c1daeSBarry Smith   PetscFunctionBegin;
985c6c1daeSBarry Smith   PetscValidHeaderSpecific(r, PETSC_RANDOM_CLASSID, 1);
995c6c1daeSBarry Smith   r->seed = 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 */
117d71ae5a4SJacob Faibussowitsch 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 
197e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
198e04113cfSBarry Smith   #include <petscviewersaws.h>
199f05ece33SBarry Smith #endif
200fe2efc57SMark 
201fe2efc57SMark /*@C
202811af0c4SBarry Smith   PetscRandomViewFromOptions - View a `PetscRandom` object based on the options database
203fe2efc57SMark 
204c3339decSBarry Smith   Collective
205fe2efc57SMark 
206fe2efc57SMark   Input Parameters:
207fe2efc57SMark + A    - the  random number generator context
208736c3998SJose E. Roman . obj  - Optional object
209736c3998SJose E. Roman - name - command line option
210fe2efc57SMark 
211fe2efc57SMark   Level: intermediate
212aec76313SJacob Faibussowitsch 
213db781477SPatrick Sanan .seealso: `PetscRandom`, `PetscRandomView`, `PetscObjectViewFromOptions()`, `PetscRandomCreate()`
214fe2efc57SMark @*/
215d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomViewFromOptions(PetscRandom A, PetscObject obj, const char name[])
216d71ae5a4SJacob Faibussowitsch {
217fe2efc57SMark   PetscFunctionBegin;
218fe2efc57SMark   PetscValidHeaderSpecific(A, PETSC_RANDOM_CLASSID, 1);
2199566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name));
2203ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
221fe2efc57SMark }
222fe2efc57SMark 
2235c6c1daeSBarry Smith /*@C
2245c6c1daeSBarry Smith   PetscRandomView - Views a random number generator object.
2255c6c1daeSBarry Smith 
226c3339decSBarry Smith   Collective
2275c6c1daeSBarry Smith 
2285c6c1daeSBarry Smith   Input Parameters:
2295c6c1daeSBarry Smith + rnd    - The random number generator context
2305c6c1daeSBarry Smith - viewer - an optional visualization context
2315c6c1daeSBarry Smith 
232c31d2375SBarry Smith   Level: beginner
233c31d2375SBarry Smith 
234811af0c4SBarry Smith   Note:
2355c6c1daeSBarry Smith   The available visualization contexts include
236811af0c4SBarry Smith +     `PETSC_VIEWER_STDOUT_SELF` - standard output (default)
237811af0c4SBarry Smith -     `PETSC_VIEWER_STDOUT_WORLD` - synchronized standard
2385c6c1daeSBarry Smith   output where only the first processor opens
2395c6c1daeSBarry Smith   the file.  All other processors send their
2405c6c1daeSBarry Smith   data to the first processor to print.
2415c6c1daeSBarry Smith 
242811af0c4SBarry Smith .seealso: `PetscRandom`, `PetscRealView()`, `PetscScalarView()`, `PetscIntView()`
2435c6c1daeSBarry Smith @*/
244d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomView(PetscRandom rnd, PetscViewer viewer)
245d71ae5a4SJacob Faibussowitsch {
2465c6c1daeSBarry Smith   PetscBool iascii;
247e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
248536b137fSBarry Smith   PetscBool issaws;
249f05ece33SBarry Smith #endif
2505c6c1daeSBarry Smith 
2515c6c1daeSBarry Smith   PetscFunctionBegin;
2525c6c1daeSBarry Smith   PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID, 1);
2535c6c1daeSBarry Smith   PetscValidType(rnd, 1);
25448a46eb9SPierre Jolivet   if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)rnd), &viewer));
2555c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
2565c6c1daeSBarry Smith   PetscCheckSameComm(rnd, 1, viewer, 2);
2579566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
258e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
2599566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSAWS, &issaws));
260f05ece33SBarry Smith #endif
2615c6c1daeSBarry Smith   if (iascii) {
2625c6c1daeSBarry Smith     PetscMPIInt rank;
2639566063dSJacob Faibussowitsch     PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)rnd, viewer));
2649566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)rnd), &rank));
2659566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushSynchronized(viewer));
2669566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "[%d] Random type %s, seed %lu\n", rank, ((PetscObject)rnd)->type_name, rnd->seed));
2679566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(viewer));
2689566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopSynchronized(viewer));
269e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
270536b137fSBarry Smith   } else if (issaws) {
271d45a07a7SBarry Smith     PetscMPIInt rank;
2722657e9d9SBarry Smith     const char *name;
273d45a07a7SBarry Smith 
2749566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetName((PetscObject)rnd, &name));
2759566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
276dd400576SPatrick Sanan     if (!((PetscObject)rnd)->amsmem && rank == 0) {
277d45a07a7SBarry Smith       char dir[1024];
278d45a07a7SBarry Smith 
2799566063dSJacob Faibussowitsch       PetscCall(PetscObjectViewSAWs((PetscObject)rnd, viewer));
2809566063dSJacob Faibussowitsch       PetscCall(PetscSNPrintf(dir, 1024, "/PETSc/Objects/%s/Low", name));
281792fecdfSBarry Smith       PetscCallSAWs(SAWs_Register, (dir, &rnd->low, 1, SAWs_READ, SAWs_DOUBLE));
282f05ece33SBarry Smith     }
283f05ece33SBarry Smith #endif
2845c6c1daeSBarry Smith   }
2853ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2865c6c1daeSBarry Smith }
2875c6c1daeSBarry Smith 
2885c6c1daeSBarry Smith /*@
289c31d2375SBarry Smith   PetscRandomCreate - Creates an object for generating random numbers,
2905c6c1daeSBarry Smith   and initializes the random-number generator.
2915c6c1daeSBarry Smith 
292d083f849SBarry Smith   Collective
2935c6c1daeSBarry Smith 
29467be906fSBarry Smith   Input Parameter:
295dc424cfaSBarry Smith . comm - MPI communicator
2965c6c1daeSBarry Smith 
2975c6c1daeSBarry Smith   Output Parameter:
298c31d2375SBarry Smith . r - the random number generator object
2995c6c1daeSBarry Smith 
3005c6c1daeSBarry Smith   Level: intermediate
3015c6c1daeSBarry Smith 
3025c6c1daeSBarry Smith   Notes:
303811af0c4SBarry Smith   The random type has to be set by `PetscRandomSetType()`.
3045c6c1daeSBarry Smith 
3056aad120cSJose E. Roman   This is only a primitive "parallel" random number generator, it should NOT
3065c6c1daeSBarry Smith   be used for sophisticated parallel Monte Carlo methods since it will very likely
3075c6c1daeSBarry Smith   not have the correct statistics across processors. You can provide your own
30867be906fSBarry Smith   parallel generator using `PetscRandomRegister()`;
3095c6c1daeSBarry Smith 
310811af0c4SBarry Smith   If you create a `PetscRandom()` using `PETSC_COMM_SELF` on several processors then
311811af0c4SBarry Smith   the SAME random numbers will be generated on all those processors. Use `PETSC_COMM_WORLD`
3125c6c1daeSBarry Smith   or the appropriate parallel communicator to eliminate this issue.
3135c6c1daeSBarry Smith 
314811af0c4SBarry Smith   Use `VecSetRandom()` to set the elements of a vector to random numbers.
3155c6c1daeSBarry Smith 
3165c6c1daeSBarry Smith   Example of Usage:
3175c6c1daeSBarry Smith .vb
3185c6c1daeSBarry Smith       PetscRandomCreate(PETSC_COMM_SELF,&r);
3195c6c1daeSBarry Smith       PetscRandomSetType(r,PETSCRAND48);
3205c6c1daeSBarry Smith       PetscRandomGetValue(r,&value1);
3215c6c1daeSBarry Smith       PetscRandomGetValueReal(r,&value2);
3225c6c1daeSBarry Smith       PetscRandomDestroy(&r);
3235c6c1daeSBarry Smith .ve
3245c6c1daeSBarry Smith 
325db781477SPatrick Sanan .seealso: `PetscRandomSetType()`, `PetscRandomGetValue()`, `PetscRandomGetValueReal()`, `PetscRandomSetInterval()`,
326811af0c4SBarry Smith           `PetscRandomDestroy()`, `VecSetRandom()`, `PetscRandomType`, `PetscRandom`
3275c6c1daeSBarry Smith @*/
328d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomCreate(MPI_Comm comm, PetscRandom *r)
329d71ae5a4SJacob Faibussowitsch {
3305c6c1daeSBarry Smith   PetscRandom rr;
3315c6c1daeSBarry Smith   PetscMPIInt rank;
3325c6c1daeSBarry Smith 
3335c6c1daeSBarry Smith   PetscFunctionBegin;
3344f572ea9SToby Isaac   PetscAssertPointer(r, 2);
3350298fd71SBarry Smith   *r = NULL;
3369566063dSJacob Faibussowitsch   PetscCall(PetscRandomInitializePackage());
3375c6c1daeSBarry Smith 
3389566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(rr, PETSC_RANDOM_CLASSID, "PetscRandom", "Random number generator", "Sys", comm, PetscRandomDestroy, PetscRandomView));
3395c6c1daeSBarry Smith 
3409566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm, &rank));
341a297a907SKarl Rupp 
3420298fd71SBarry Smith   rr->data  = NULL;
3435c6c1daeSBarry Smith   rr->low   = 0.0;
3445c6c1daeSBarry Smith   rr->width = 1.0;
3455c6c1daeSBarry Smith   rr->iset  = PETSC_FALSE;
3465c6c1daeSBarry Smith   rr->seed  = 0x12345678 + 76543 * rank;
3479566063dSJacob Faibussowitsch   PetscCall(PetscRandomSetType(rr, PETSCRANDER48));
3485c6c1daeSBarry Smith   *r = rr;
3493ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3505c6c1daeSBarry Smith }
3515c6c1daeSBarry Smith 
3525c6c1daeSBarry Smith /*@
353811af0c4SBarry Smith   PetscRandomSeed - Seed the random number generator.
3545c6c1daeSBarry Smith 
3555c6c1daeSBarry Smith   Not collective
3565c6c1daeSBarry Smith 
3572fe279fdSBarry Smith   Input Parameter:
3585c6c1daeSBarry Smith . r - The random number generator context
3595c6c1daeSBarry Smith 
3605c6c1daeSBarry Smith   Level: intermediate
3615c6c1daeSBarry Smith 
36210450e9eSJacob Faibussowitsch   Example Usage:
363811af0c4SBarry Smith .vb
3645c6c1daeSBarry Smith       PetscRandomSetSeed(r,a positive integer);
365811af0c4SBarry Smith       PetscRandomSeed(r);
366811af0c4SBarry Smith       PetscRandomGetValue() will now start with the new seed.
3675c6c1daeSBarry Smith 
3685c6c1daeSBarry Smith       PetscRandomSeed(r) without a call to PetscRandomSetSeed() re-initializes
3695c6c1daeSBarry Smith       the seed. The random numbers generated will be the same as before.
370811af0c4SBarry Smith .ve
3715c6c1daeSBarry Smith 
372db781477SPatrick Sanan .seealso: `PetscRandomCreate()`, `PetscRandomGetSeed()`, `PetscRandomSetSeed()`
3735c6c1daeSBarry Smith @*/
374d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscRandomSeed(PetscRandom r)
375d71ae5a4SJacob Faibussowitsch {
3765c6c1daeSBarry Smith   PetscFunctionBegin;
3775c6c1daeSBarry Smith   PetscValidHeaderSpecific(r, PETSC_RANDOM_CLASSID, 1);
3785c6c1daeSBarry Smith   PetscValidType(r, 1);
3795c6c1daeSBarry Smith 
380dbbe0bcdSBarry Smith   PetscUseTypeMethod(r, seed);
3819566063dSJacob Faibussowitsch   PetscCall(PetscObjectStateIncrease((PetscObject)r));
3823ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3835c6c1daeSBarry Smith }
384