xref: /petsc/src/sys/classes/random/interface/randreg.c (revision 1c9cd33768b1fd01403e37595b64fe66efc857ab)
15c6c1daeSBarry Smith 
25c6c1daeSBarry Smith #include <../src/sys/classes/random/randomimpl.h>         /*I "petscsys.h" I*/
35c6c1daeSBarry Smith 
40298fd71SBarry Smith PetscFunctionList PetscRandomList              = NULL;
55c6c1daeSBarry Smith PetscBool         PetscRandomRegisterAllCalled = PETSC_FALSE;
65c6c1daeSBarry Smith 
75c6c1daeSBarry Smith #undef __FUNCT__
85c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomSetType"
95c6c1daeSBarry Smith /*@C
105c6c1daeSBarry Smith   PetscRandomSetType - Builds a context for generating particular type of random numbers.
115c6c1daeSBarry Smith 
125c6c1daeSBarry Smith   Collective on PetscRandom
135c6c1daeSBarry Smith 
145c6c1daeSBarry Smith   Input Parameters:
155c6c1daeSBarry Smith + rnd   - The random number generator context
165c6c1daeSBarry Smith - type - The name of the random type
175c6c1daeSBarry Smith 
185c6c1daeSBarry Smith   Options Database Key:
195c6c1daeSBarry Smith . -random_type <type> - Sets the random type; use -help for a list
205c6c1daeSBarry Smith                      of available types
215c6c1daeSBarry Smith 
225c6c1daeSBarry Smith   Notes:
235c6c1daeSBarry Smith   See "petsc/include/petscsys.h" for available random types (for instance, PETSCRAND48, PETSCRAND).
245c6c1daeSBarry Smith 
255c6c1daeSBarry Smith   Level: intermediate
265c6c1daeSBarry Smith 
275c6c1daeSBarry Smith .keywords: random, set, type
285c6c1daeSBarry Smith .seealso: PetscRandomGetType(), PetscRandomCreate()
295c6c1daeSBarry Smith @*/
305c6c1daeSBarry Smith 
315c6c1daeSBarry Smith PetscErrorCode  PetscRandomSetType(PetscRandom rnd, PetscRandomType type)
325c6c1daeSBarry Smith {
335c6c1daeSBarry Smith   PetscErrorCode (*r)(PetscRandom);
345c6c1daeSBarry Smith   PetscBool      match;
355c6c1daeSBarry Smith   PetscErrorCode ierr;
365c6c1daeSBarry Smith 
375c6c1daeSBarry Smith   PetscFunctionBegin;
385c6c1daeSBarry Smith   PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID,1);
395c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)rnd, type, &match);CHKERRQ(ierr);
405c6c1daeSBarry Smith   if (match) PetscFunctionReturn(0);
415c6c1daeSBarry Smith 
42*1c9cd337SJed Brown   ierr = PetscFunctionListFind(PetscRandomList,type,&r);CHKERRQ(ierr);
435c6c1daeSBarry Smith   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown random type: %s", type);
445c6c1daeSBarry Smith 
455c6c1daeSBarry Smith   if (rnd->ops->destroy) {
465c6c1daeSBarry Smith     ierr = (*rnd->ops->destroy)(rnd);CHKERRQ(ierr);
47a297a907SKarl Rupp 
480298fd71SBarry Smith     rnd->ops->destroy = NULL;
495c6c1daeSBarry Smith   }
505c6c1daeSBarry Smith   ierr = (*r)(rnd);CHKERRQ(ierr);
515c6c1daeSBarry Smith   ierr = PetscRandomSeed(rnd);CHKERRQ(ierr);
525c6c1daeSBarry Smith 
535c6c1daeSBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)rnd, type);CHKERRQ(ierr);
545c6c1daeSBarry Smith   PetscFunctionReturn(0);
555c6c1daeSBarry Smith }
565c6c1daeSBarry Smith 
575c6c1daeSBarry Smith #undef __FUNCT__
585c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomGetType"
595c6c1daeSBarry Smith /*@C
605c6c1daeSBarry Smith   PetscRandomGetType - Gets the type name (as a string) from the PetscRandom.
615c6c1daeSBarry Smith 
625c6c1daeSBarry Smith   Not Collective
635c6c1daeSBarry Smith 
645c6c1daeSBarry Smith   Input Parameter:
655c6c1daeSBarry Smith . rnd  - The random number generator context
665c6c1daeSBarry Smith 
675c6c1daeSBarry Smith   Output Parameter:
685c6c1daeSBarry Smith . type - The type name
695c6c1daeSBarry Smith 
705c6c1daeSBarry Smith   Level: intermediate
715c6c1daeSBarry Smith 
725c6c1daeSBarry Smith .keywords: random, get, type, name
735c6c1daeSBarry Smith .seealso: PetscRandomSetType(), PetscRandomCreate()
745c6c1daeSBarry Smith @*/
755c6c1daeSBarry Smith PetscErrorCode  PetscRandomGetType(PetscRandom rnd, PetscRandomType *type)
765c6c1daeSBarry Smith {
775c6c1daeSBarry Smith   PetscFunctionBegin;
785c6c1daeSBarry Smith   PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID,1);
795c6c1daeSBarry Smith   PetscValidPointer(type,2);
805c6c1daeSBarry Smith   *type = ((PetscObject)rnd)->type_name;
815c6c1daeSBarry Smith   PetscFunctionReturn(0);
825c6c1daeSBarry Smith }
835c6c1daeSBarry Smith 
845c6c1daeSBarry Smith #undef __FUNCT__
855c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomRegister"
865c6c1daeSBarry Smith /*@C
871c84c290SBarry Smith   PetscRandomRegister -  Adds a new PetscRandom component implementation
881c84c290SBarry Smith 
891c84c290SBarry Smith   Not Collective
901c84c290SBarry Smith 
911c84c290SBarry Smith   Input Parameters:
921c84c290SBarry Smith + name        - The name of a new user-defined creation routine
931c84c290SBarry Smith - create_func - The creation routine itself
941c84c290SBarry Smith 
951c84c290SBarry Smith   Notes:
961c84c290SBarry Smith   PetscRandomRegister() may be called multiple times to add several user-defined randome number generators
971c84c290SBarry Smith 
981c84c290SBarry Smith   Sample usage:
991c84c290SBarry Smith .vb
100bdf89e91SBarry Smith     PetscRandomRegister("my_rand",  MyPetscRandomtorCreate);
1011c84c290SBarry Smith .ve
1021c84c290SBarry Smith 
1031c84c290SBarry Smith   Then, your random type can be chosen with the procedural interface via
1041c84c290SBarry Smith .vb
1051c84c290SBarry Smith     PetscRandomCreate(MPI_Comm, PetscRandom *);
1061c84c290SBarry Smith     PetscRandomSetType(PetscRandom,"my_random_name");
1071c84c290SBarry Smith .ve
1081c84c290SBarry Smith    or at runtime via the option
1091c84c290SBarry Smith .vb
1101c84c290SBarry Smith     -random_type my_random_name
1111c84c290SBarry Smith .ve
1121c84c290SBarry Smith 
1131c84c290SBarry Smith   Notes: For an example of the code needed to interface your own random number generator see
1141c84c290SBarry Smith          src/sys/random/impls/rand/rand.c
1155c6c1daeSBarry Smith 
1165c6c1daeSBarry Smith   Level: advanced
1171c84c290SBarry Smith 
1181c84c290SBarry Smith .keywords: PetscRandom, register
1191c84c290SBarry Smith 
1201c84c290SBarry Smith .seealso: PetscRandomRegisterAll(), PetscRandomRegisterDestroy(), PetscRandomRegister()
1215c6c1daeSBarry Smith @*/
122bdf89e91SBarry Smith PetscErrorCode  PetscRandomRegister(const char sname[], PetscErrorCode (*function)(PetscRandom))
1235c6c1daeSBarry Smith {
1245c6c1daeSBarry Smith   PetscErrorCode ierr;
1255c6c1daeSBarry Smith 
1265c6c1daeSBarry Smith   PetscFunctionBegin;
127bdf89e91SBarry Smith   ierr = PetscFunctionListAdd(&PetscRandomList,sname,(void (*)(void))function);CHKERRQ(ierr);
1285c6c1daeSBarry Smith   PetscFunctionReturn(0);
1295c6c1daeSBarry Smith }
1305c6c1daeSBarry Smith 
1315c6c1daeSBarry Smith 
1325c6c1daeSBarry Smith /*--------------------------------------------------------------------------------------------------------------------*/
1335c6c1daeSBarry Smith #undef __FUNCT__
1345c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomRegisterDestroy"
1355c6c1daeSBarry Smith /*@C
136607a6623SBarry Smith    PetscRandomRegisterDestroy - Frees the list of Random types that were registered by PetscRandomRegister().
1375c6c1daeSBarry Smith 
1385c6c1daeSBarry Smith    Not Collective
1395c6c1daeSBarry Smith 
1405c6c1daeSBarry Smith    Level: advanced
1415c6c1daeSBarry Smith 
1425c6c1daeSBarry Smith .keywords: PetscRandom, register, destroy
1431c84c290SBarry Smith .seealso: PetscRandomRegister(), PetscRandomRegisterAll(), PetscRandomRegister()
1445c6c1daeSBarry Smith @*/
1455c6c1daeSBarry Smith PetscErrorCode  PetscRandomRegisterDestroy(void)
1465c6c1daeSBarry Smith {
1475c6c1daeSBarry Smith   PetscErrorCode ierr;
1485c6c1daeSBarry Smith 
1495c6c1daeSBarry Smith   PetscFunctionBegin;
150140e18c1SBarry Smith   ierr = PetscFunctionListDestroy(&PetscRandomList);CHKERRQ(ierr);
151a297a907SKarl Rupp 
1525c6c1daeSBarry Smith   PetscRandomRegisterAllCalled = PETSC_FALSE;
1535c6c1daeSBarry Smith   PetscFunctionReturn(0);
1545c6c1daeSBarry Smith }
1555c6c1daeSBarry Smith 
1565c6c1daeSBarry Smith #if defined(PETSC_HAVE_RAND)
1578cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom);
1585c6c1daeSBarry Smith #endif
1595c6c1daeSBarry Smith #if defined(PETSC_HAVE_DRAND48)
1608cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand48(PetscRandom);
1615c6c1daeSBarry Smith #endif
1625c6c1daeSBarry Smith #if defined(PETSC_HAVE_SPRNG)
1638cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom);
1645c6c1daeSBarry Smith #endif
1655c6c1daeSBarry Smith 
1665c6c1daeSBarry Smith #undef __FUNCT__
1675c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomRegisterAll"
1685c6c1daeSBarry Smith /*@C
1695c6c1daeSBarry Smith   PetscRandomRegisterAll - Registers all of the components in the PetscRandom package.
1705c6c1daeSBarry Smith 
1715c6c1daeSBarry Smith   Not Collective
1725c6c1daeSBarry Smith 
1735c6c1daeSBarry Smith   Level: advanced
1745c6c1daeSBarry Smith 
1755c6c1daeSBarry Smith .keywords: PetscRandom, register, all
176607a6623SBarry Smith .seealso:  PetscRandomRegister(), PetscRandomRegisterDestroy()
1775c6c1daeSBarry Smith @*/
178607a6623SBarry Smith PetscErrorCode  PetscRandomRegisterAll(void)
1795c6c1daeSBarry Smith {
1805c6c1daeSBarry Smith   PetscErrorCode ierr;
1815c6c1daeSBarry Smith 
1825c6c1daeSBarry Smith   PetscFunctionBegin;
1835c6c1daeSBarry Smith   PetscRandomRegisterAllCalled = PETSC_TRUE;
1845c6c1daeSBarry Smith #if defined(PETSC_HAVE_RAND)
185bdf89e91SBarry Smith   ierr = PetscRandomRegister(PETSCRAND,  PetscRandomCreate_Rand);CHKERRQ(ierr);
1865c6c1daeSBarry Smith #endif
1875c6c1daeSBarry Smith #if defined(PETSC_HAVE_DRAND48)
188bdf89e91SBarry Smith   ierr = PetscRandomRegister(PETSCRAND48,PetscRandomCreate_Rand48);CHKERRQ(ierr);
1895c6c1daeSBarry Smith #endif
1905c6c1daeSBarry Smith #if defined(PETSC_HAVE_SPRNG)
191bdf89e91SBarry Smith   ierr = PetscRandomRegister(PETSCSPRNG, PetscRandomCreate_Sprng);CHKERRQ(ierr);
1925c6c1daeSBarry Smith #endif
1935c6c1daeSBarry Smith   PetscFunctionReturn(0);
1945c6c1daeSBarry Smith }
1955c6c1daeSBarry Smith 
196