xref: /petsc/src/sys/classes/random/interface/randreg.c (revision 28b400f66ebc7ae0049166a2294dfcd3df27e64b)
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 
335c6c1daeSBarry Smith   PetscFunctionBegin;
345c6c1daeSBarry Smith   PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID,1);
355f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject)rnd, type, &match));
365c6c1daeSBarry Smith   if (match) PetscFunctionReturn(0);
375c6c1daeSBarry Smith 
385f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFunctionListFind(PetscRandomList,type,&r));
39*28b400f6SJacob Faibussowitsch   PetscCheck(r,PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown random type: %s", type);
405c6c1daeSBarry Smith 
415c6c1daeSBarry Smith   if (rnd->ops->destroy) {
425f80ce2aSJacob Faibussowitsch     CHKERRQ((*rnd->ops->destroy)(rnd));
43a297a907SKarl Rupp 
440298fd71SBarry Smith     rnd->ops->destroy = NULL;
455c6c1daeSBarry Smith   }
465f80ce2aSJacob Faibussowitsch   CHKERRQ((*r)(rnd));
475f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscRandomSeed(rnd));
485c6c1daeSBarry Smith 
495f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectChangeTypeName((PetscObject)rnd, type));
505c6c1daeSBarry Smith   PetscFunctionReturn(0);
515c6c1daeSBarry Smith }
525c6c1daeSBarry Smith 
535c6c1daeSBarry Smith /*@C
545c6c1daeSBarry Smith   PetscRandomGetType - Gets the type name (as a string) from the PetscRandom.
555c6c1daeSBarry Smith 
565c6c1daeSBarry Smith   Not Collective
575c6c1daeSBarry Smith 
585c6c1daeSBarry Smith   Input Parameter:
595c6c1daeSBarry Smith . rnd  - The random number generator context
605c6c1daeSBarry Smith 
615c6c1daeSBarry Smith   Output Parameter:
625c6c1daeSBarry Smith . type - The type name
635c6c1daeSBarry Smith 
645c6c1daeSBarry Smith   Level: intermediate
655c6c1daeSBarry Smith 
665c6c1daeSBarry Smith .seealso: PetscRandomSetType(), PetscRandomCreate()
675c6c1daeSBarry Smith @*/
685c6c1daeSBarry Smith PetscErrorCode  PetscRandomGetType(PetscRandom rnd, PetscRandomType *type)
695c6c1daeSBarry Smith {
705c6c1daeSBarry Smith   PetscFunctionBegin;
715c6c1daeSBarry Smith   PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID,1);
725c6c1daeSBarry Smith   PetscValidPointer(type,2);
735c6c1daeSBarry Smith   *type = ((PetscObject)rnd)->type_name;
745c6c1daeSBarry Smith   PetscFunctionReturn(0);
755c6c1daeSBarry Smith }
765c6c1daeSBarry Smith 
775c6c1daeSBarry Smith /*@C
781c84c290SBarry Smith   PetscRandomRegister -  Adds a new PetscRandom component implementation
791c84c290SBarry Smith 
801c84c290SBarry Smith   Not Collective
811c84c290SBarry Smith 
821c84c290SBarry Smith   Input Parameters:
831c84c290SBarry Smith + name        - The name of a new user-defined creation routine
841c84c290SBarry Smith - create_func - The creation routine itself
851c84c290SBarry Smith 
861c84c290SBarry Smith   Notes:
871c84c290SBarry Smith   PetscRandomRegister() may be called multiple times to add several user-defined randome number generators
881c84c290SBarry Smith 
891c84c290SBarry Smith   Sample usage:
901c84c290SBarry Smith .vb
91bdf89e91SBarry Smith     PetscRandomRegister("my_rand",  MyPetscRandomtorCreate);
921c84c290SBarry Smith .ve
931c84c290SBarry Smith 
941c84c290SBarry Smith   Then, your random type can be chosen with the procedural interface via
951c84c290SBarry Smith .vb
961c84c290SBarry Smith     PetscRandomCreate(MPI_Comm, PetscRandom *);
971c84c290SBarry Smith     PetscRandomSetType(PetscRandom,"my_random_name");
981c84c290SBarry Smith .ve
991c84c290SBarry Smith    or at runtime via the option
1001c84c290SBarry Smith .vb
1011c84c290SBarry Smith     -random_type my_random_name
1021c84c290SBarry Smith .ve
1031c84c290SBarry Smith 
10495452b02SPatrick Sanan   Notes:
10595452b02SPatrick Sanan     For an example of the code needed to interface your own random number generator see
1061c84c290SBarry Smith          src/sys/random/impls/rand/rand.c
1075c6c1daeSBarry Smith 
1085c6c1daeSBarry Smith   Level: advanced
1091c84c290SBarry Smith 
1101c84c290SBarry Smith .seealso: PetscRandomRegisterAll(), PetscRandomRegisterDestroy(), PetscRandomRegister()
1115c6c1daeSBarry Smith @*/
112bdf89e91SBarry Smith PetscErrorCode  PetscRandomRegister(const char sname[], PetscErrorCode (*function)(PetscRandom))
1135c6c1daeSBarry Smith {
1145c6c1daeSBarry Smith   PetscFunctionBegin;
1155f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscRandomInitializePackage());
1165f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFunctionListAdd(&PetscRandomList,sname,function));
1175c6c1daeSBarry Smith   PetscFunctionReturn(0);
1185c6c1daeSBarry Smith }
1195c6c1daeSBarry Smith 
1205c6c1daeSBarry Smith #if defined(PETSC_HAVE_RAND)
1218cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom);
1225c6c1daeSBarry Smith #endif
1235c6c1daeSBarry Smith #if defined(PETSC_HAVE_DRAND48)
1248cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand48(PetscRandom);
1255c6c1daeSBarry Smith #endif
1265c6c1daeSBarry Smith #if defined(PETSC_HAVE_SPRNG)
1278cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom);
1285c6c1daeSBarry Smith #endif
129003ee160SMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rander48(PetscRandom);
13025ccb61fSToby Isaac #if defined(PETSC_HAVE_RANDOM123)
13125ccb61fSToby Isaac PETSC_EXTERN PetscErrorCode PetscRandomCreate_Random123(PetscRandom);
13225ccb61fSToby Isaac #endif
133808ba619SStefano Zampini #if defined(PETSC_HAVE_CUDA)
134808ba619SStefano Zampini PETSC_EXTERN PetscErrorCode PetscRandomCreate_CURAND(PetscRandom);
135808ba619SStefano Zampini #endif
1365c6c1daeSBarry Smith 
1375c6c1daeSBarry Smith /*@C
1385c6c1daeSBarry Smith   PetscRandomRegisterAll - Registers all of the components in the PetscRandom package.
1395c6c1daeSBarry Smith 
1405c6c1daeSBarry Smith   Not Collective
1415c6c1daeSBarry Smith 
1425c6c1daeSBarry Smith   Level: advanced
1435c6c1daeSBarry Smith 
144607a6623SBarry Smith .seealso:  PetscRandomRegister(), PetscRandomRegisterDestroy()
1455c6c1daeSBarry Smith @*/
146607a6623SBarry Smith PetscErrorCode  PetscRandomRegisterAll(void)
1475c6c1daeSBarry Smith {
1485c6c1daeSBarry Smith   PetscFunctionBegin;
1490f51fdf8SToby Isaac   if (PetscRandomRegisterAllCalled) PetscFunctionReturn(0);
1505c6c1daeSBarry Smith   PetscRandomRegisterAllCalled = PETSC_TRUE;
1515c6c1daeSBarry Smith #if defined(PETSC_HAVE_RAND)
1525f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscRandomRegister(PETSCRAND,PetscRandomCreate_Rand));
1535c6c1daeSBarry Smith #endif
1545c6c1daeSBarry Smith #if defined(PETSC_HAVE_DRAND48)
1555f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscRandomRegister(PETSCRAND48,PetscRandomCreate_Rand48));
1565c6c1daeSBarry Smith #endif
1575c6c1daeSBarry Smith #if defined(PETSC_HAVE_SPRNG)
1585f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscRandomRegister(PETSCSPRNG,PetscRandomCreate_Sprng));
1595c6c1daeSBarry Smith #endif
1605f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscRandomRegister(PETSCRANDER48,PetscRandomCreate_Rander48));
16125ccb61fSToby Isaac #if defined(PETSC_HAVE_RANDOM123)
1625f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscRandomRegister(PETSCRANDOM123,PetscRandomCreate_Random123));
16325ccb61fSToby Isaac #endif
164808ba619SStefano Zampini #if defined(PETSC_HAVE_CUDA)
1655f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscRandomRegister(PETSCCURAND,PetscRandomCreate_CURAND));
166808ba619SStefano Zampini #endif
1675c6c1daeSBarry Smith   PetscFunctionReturn(0);
1685c6c1daeSBarry Smith }
169