xref: /petsc/src/sys/classes/random/interface/randreg.c (revision 2c71b3e237ead271e4f3aa1505f92bf476e3413d)
15c6c1daeSBarry Smith 
2d6cc7855SJacob Faibussowitsch #include <petsc/private/randomimpl.h>         /*I "petscsys.h" I*/
35c6c1daeSBarry Smith 
40298fd71SBarry Smith PetscFunctionList PetscRandomList              = NULL;
55c6c1daeSBarry Smith PetscBool         PetscRandomRegisterAllCalled = PETSC_FALSE;
65c6c1daeSBarry Smith 
75c6c1daeSBarry Smith /*@C
85c6c1daeSBarry Smith   PetscRandomSetType - Builds a context for generating particular type of random numbers.
95c6c1daeSBarry Smith 
105c6c1daeSBarry Smith   Collective on PetscRandom
115c6c1daeSBarry Smith 
125c6c1daeSBarry Smith   Input Parameters:
135c6c1daeSBarry Smith + rnd   - The random number generator context
145c6c1daeSBarry Smith - type - The name of the random type
155c6c1daeSBarry Smith 
165c6c1daeSBarry Smith   Options Database Key:
175c6c1daeSBarry Smith . -random_type <type> - Sets the random type; use -help for a list
185c6c1daeSBarry Smith                      of available types
195c6c1daeSBarry Smith 
205c6c1daeSBarry Smith   Notes:
215c6c1daeSBarry Smith   See "petsc/include/petscsys.h" for available random types (for instance, PETSCRAND48, PETSCRAND).
225c6c1daeSBarry Smith 
235c6c1daeSBarry Smith   Level: intermediate
245c6c1daeSBarry Smith 
255c6c1daeSBarry Smith .seealso: PetscRandomGetType(), PetscRandomCreate()
265c6c1daeSBarry Smith @*/
275c6c1daeSBarry Smith 
285c6c1daeSBarry Smith PetscErrorCode  PetscRandomSetType(PetscRandom rnd, PetscRandomType type)
295c6c1daeSBarry Smith {
305c6c1daeSBarry Smith   PetscErrorCode (*r)(PetscRandom);
315c6c1daeSBarry Smith   PetscBool      match;
325c6c1daeSBarry Smith   PetscErrorCode ierr;
335c6c1daeSBarry Smith 
345c6c1daeSBarry Smith   PetscFunctionBegin;
355c6c1daeSBarry Smith   PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID,1);
365c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)rnd, type, &match);CHKERRQ(ierr);
375c6c1daeSBarry Smith   if (match) PetscFunctionReturn(0);
385c6c1daeSBarry Smith 
391c9cd337SJed Brown   ierr = PetscFunctionListFind(PetscRandomList,type,&r);CHKERRQ(ierr);
40*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(!r,PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown random type: %s", type);
415c6c1daeSBarry Smith 
425c6c1daeSBarry Smith   if (rnd->ops->destroy) {
435c6c1daeSBarry Smith     ierr = (*rnd->ops->destroy)(rnd);CHKERRQ(ierr);
44a297a907SKarl Rupp 
450298fd71SBarry Smith     rnd->ops->destroy = NULL;
465c6c1daeSBarry Smith   }
475c6c1daeSBarry Smith   ierr = (*r)(rnd);CHKERRQ(ierr);
485c6c1daeSBarry Smith   ierr = PetscRandomSeed(rnd);CHKERRQ(ierr);
495c6c1daeSBarry Smith 
505c6c1daeSBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)rnd, type);CHKERRQ(ierr);
515c6c1daeSBarry Smith   PetscFunctionReturn(0);
525c6c1daeSBarry Smith }
535c6c1daeSBarry Smith 
545c6c1daeSBarry Smith /*@C
555c6c1daeSBarry Smith   PetscRandomGetType - Gets the type name (as a string) from the PetscRandom.
565c6c1daeSBarry Smith 
575c6c1daeSBarry Smith   Not Collective
585c6c1daeSBarry Smith 
595c6c1daeSBarry Smith   Input Parameter:
605c6c1daeSBarry Smith . rnd  - The random number generator context
615c6c1daeSBarry Smith 
625c6c1daeSBarry Smith   Output Parameter:
635c6c1daeSBarry Smith . type - The type name
645c6c1daeSBarry Smith 
655c6c1daeSBarry Smith   Level: intermediate
665c6c1daeSBarry Smith 
675c6c1daeSBarry Smith .seealso: PetscRandomSetType(), PetscRandomCreate()
685c6c1daeSBarry Smith @*/
695c6c1daeSBarry Smith PetscErrorCode  PetscRandomGetType(PetscRandom rnd, PetscRandomType *type)
705c6c1daeSBarry Smith {
715c6c1daeSBarry Smith   PetscFunctionBegin;
725c6c1daeSBarry Smith   PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID,1);
735c6c1daeSBarry Smith   PetscValidPointer(type,2);
745c6c1daeSBarry Smith   *type = ((PetscObject)rnd)->type_name;
755c6c1daeSBarry Smith   PetscFunctionReturn(0);
765c6c1daeSBarry Smith }
775c6c1daeSBarry Smith 
785c6c1daeSBarry Smith /*@C
791c84c290SBarry Smith   PetscRandomRegister -  Adds a new PetscRandom component implementation
801c84c290SBarry Smith 
811c84c290SBarry Smith   Not Collective
821c84c290SBarry Smith 
831c84c290SBarry Smith   Input Parameters:
841c84c290SBarry Smith + name        - The name of a new user-defined creation routine
851c84c290SBarry Smith - create_func - The creation routine itself
861c84c290SBarry Smith 
871c84c290SBarry Smith   Notes:
881c84c290SBarry Smith   PetscRandomRegister() may be called multiple times to add several user-defined randome number generators
891c84c290SBarry Smith 
901c84c290SBarry Smith   Sample usage:
911c84c290SBarry Smith .vb
92bdf89e91SBarry Smith     PetscRandomRegister("my_rand",  MyPetscRandomtorCreate);
931c84c290SBarry Smith .ve
941c84c290SBarry Smith 
951c84c290SBarry Smith   Then, your random type can be chosen with the procedural interface via
961c84c290SBarry Smith .vb
971c84c290SBarry Smith     PetscRandomCreate(MPI_Comm, PetscRandom *);
981c84c290SBarry Smith     PetscRandomSetType(PetscRandom,"my_random_name");
991c84c290SBarry Smith .ve
1001c84c290SBarry Smith    or at runtime via the option
1011c84c290SBarry Smith .vb
1021c84c290SBarry Smith     -random_type my_random_name
1031c84c290SBarry Smith .ve
1041c84c290SBarry Smith 
10595452b02SPatrick Sanan   Notes:
10695452b02SPatrick Sanan     For an example of the code needed to interface your own random number generator see
1071c84c290SBarry Smith          src/sys/random/impls/rand/rand.c
1085c6c1daeSBarry Smith 
1095c6c1daeSBarry Smith   Level: advanced
1101c84c290SBarry Smith 
1111c84c290SBarry Smith .seealso: PetscRandomRegisterAll(), PetscRandomRegisterDestroy(), PetscRandomRegister()
1125c6c1daeSBarry Smith @*/
113bdf89e91SBarry Smith PetscErrorCode  PetscRandomRegister(const char sname[], PetscErrorCode (*function)(PetscRandom))
1145c6c1daeSBarry Smith {
1155c6c1daeSBarry Smith   PetscErrorCode ierr;
1165c6c1daeSBarry Smith 
1175c6c1daeSBarry Smith   PetscFunctionBegin;
1181d36bdfdSBarry Smith   ierr = PetscRandomInitializePackage();CHKERRQ(ierr);
119a240a19fSJed Brown   ierr = PetscFunctionListAdd(&PetscRandomList,sname,function);CHKERRQ(ierr);
1205c6c1daeSBarry Smith   PetscFunctionReturn(0);
1215c6c1daeSBarry Smith }
1225c6c1daeSBarry Smith 
1235c6c1daeSBarry Smith #if defined(PETSC_HAVE_RAND)
1248cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom);
1255c6c1daeSBarry Smith #endif
1265c6c1daeSBarry Smith #if defined(PETSC_HAVE_DRAND48)
1278cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand48(PetscRandom);
1285c6c1daeSBarry Smith #endif
1295c6c1daeSBarry Smith #if defined(PETSC_HAVE_SPRNG)
1308cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom);
1315c6c1daeSBarry Smith #endif
132003ee160SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rander48(PetscRandom);
13325ccb61fSToby Isaac #if defined(PETSC_HAVE_RANDOM123)
13425ccb61fSToby Isaac PETSC_EXTERN PetscErrorCode PetscRandomCreate_Random123(PetscRandom);
13525ccb61fSToby Isaac #endif
136808ba619SStefano Zampini #if defined(PETSC_HAVE_CUDA)
137808ba619SStefano Zampini PETSC_EXTERN PetscErrorCode PetscRandomCreate_CURAND(PetscRandom);
138808ba619SStefano Zampini #endif
1395c6c1daeSBarry Smith 
1405c6c1daeSBarry Smith /*@C
1415c6c1daeSBarry Smith   PetscRandomRegisterAll - Registers all of the components in the PetscRandom package.
1425c6c1daeSBarry Smith 
1435c6c1daeSBarry Smith   Not Collective
1445c6c1daeSBarry Smith 
1455c6c1daeSBarry Smith   Level: advanced
1465c6c1daeSBarry Smith 
147607a6623SBarry Smith .seealso:  PetscRandomRegister(), PetscRandomRegisterDestroy()
1485c6c1daeSBarry Smith @*/
149607a6623SBarry Smith PetscErrorCode  PetscRandomRegisterAll(void)
1505c6c1daeSBarry Smith {
1515c6c1daeSBarry Smith   PetscErrorCode ierr;
1525c6c1daeSBarry Smith 
1535c6c1daeSBarry Smith   PetscFunctionBegin;
1540f51fdf8SToby Isaac   if (PetscRandomRegisterAllCalled) PetscFunctionReturn(0);
1555c6c1daeSBarry Smith   PetscRandomRegisterAllCalled = PETSC_TRUE;
1565c6c1daeSBarry Smith #if defined(PETSC_HAVE_RAND)
157bdf89e91SBarry Smith   ierr = PetscRandomRegister(PETSCRAND,PetscRandomCreate_Rand);CHKERRQ(ierr);
1585c6c1daeSBarry Smith #endif
1595c6c1daeSBarry Smith #if defined(PETSC_HAVE_DRAND48)
160bdf89e91SBarry Smith   ierr = PetscRandomRegister(PETSCRAND48,PetscRandomCreate_Rand48);CHKERRQ(ierr);
1615c6c1daeSBarry Smith #endif
1625c6c1daeSBarry Smith #if defined(PETSC_HAVE_SPRNG)
163bdf89e91SBarry Smith   ierr = PetscRandomRegister(PETSCSPRNG,PetscRandomCreate_Sprng);CHKERRQ(ierr);
1645c6c1daeSBarry Smith #endif
165003ee160SMatthew G. Knepley   ierr = PetscRandomRegister(PETSCRANDER48,PetscRandomCreate_Rander48);CHKERRQ(ierr);
16625ccb61fSToby Isaac #if defined(PETSC_HAVE_RANDOM123)
16725ccb61fSToby Isaac   ierr = PetscRandomRegister(PETSCRANDOM123,PetscRandomCreate_Random123);CHKERRQ(ierr);
16825ccb61fSToby Isaac #endif
169808ba619SStefano Zampini #if defined(PETSC_HAVE_CUDA)
170808ba619SStefano Zampini   ierr = PetscRandomRegister(PETSCCURAND,PetscRandomCreate_CURAND);CHKERRQ(ierr);
171808ba619SStefano Zampini #endif
1725c6c1daeSBarry Smith   PetscFunctionReturn(0);
1735c6c1daeSBarry Smith }
1745c6c1daeSBarry Smith 
175