xref: /petsc/src/sys/classes/random/interface/randreg.c (revision 8cc058d9cd56c1ccb3be12a47760ddfc446aaffc)
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 
42ce94432eSBarry Smith   ierr = PetscFunctionListFind(PetscObjectComm((PetscObject)rnd),PetscRandomList,  type,PETSC_TRUE,(void (**)(void)) &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 #if defined(PETSC_HAVE_AMS)
555c6c1daeSBarry Smith   if (PetscAMSPublishAll) {
565c6c1daeSBarry Smith     ierr = PetscObjectAMSPublish((PetscObject)rnd);CHKERRQ(ierr);
575c6c1daeSBarry Smith   }
585c6c1daeSBarry Smith #endif
595c6c1daeSBarry Smith   PetscFunctionReturn(0);
605c6c1daeSBarry Smith }
615c6c1daeSBarry Smith 
625c6c1daeSBarry Smith #undef __FUNCT__
635c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomGetType"
645c6c1daeSBarry Smith /*@C
655c6c1daeSBarry Smith   PetscRandomGetType - Gets the type name (as a string) from the PetscRandom.
665c6c1daeSBarry Smith 
675c6c1daeSBarry Smith   Not Collective
685c6c1daeSBarry Smith 
695c6c1daeSBarry Smith   Input Parameter:
705c6c1daeSBarry Smith . rnd  - The random number generator context
715c6c1daeSBarry Smith 
725c6c1daeSBarry Smith   Output Parameter:
735c6c1daeSBarry Smith . type - The type name
745c6c1daeSBarry Smith 
755c6c1daeSBarry Smith   Level: intermediate
765c6c1daeSBarry Smith 
775c6c1daeSBarry Smith .keywords: random, get, type, name
785c6c1daeSBarry Smith .seealso: PetscRandomSetType(), PetscRandomCreate()
795c6c1daeSBarry Smith @*/
805c6c1daeSBarry Smith PetscErrorCode  PetscRandomGetType(PetscRandom rnd, PetscRandomType *type)
815c6c1daeSBarry Smith {
825c6c1daeSBarry Smith   PetscFunctionBegin;
835c6c1daeSBarry Smith   PetscValidHeaderSpecific(rnd, PETSC_RANDOM_CLASSID,1);
845c6c1daeSBarry Smith   PetscValidPointer(type,2);
855c6c1daeSBarry Smith   *type = ((PetscObject)rnd)->type_name;
865c6c1daeSBarry Smith   PetscFunctionReturn(0);
875c6c1daeSBarry Smith }
885c6c1daeSBarry Smith 
895c6c1daeSBarry Smith #undef __FUNCT__
905c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomRegister"
915c6c1daeSBarry Smith /*@C
925c6c1daeSBarry Smith   PetscRandomRegister - See PetscRandomRegisterDynamic()
935c6c1daeSBarry Smith 
945c6c1daeSBarry Smith   Level: advanced
955c6c1daeSBarry Smith @*/
965c6c1daeSBarry Smith PetscErrorCode  PetscRandomRegister(const char sname[], const char path[], const char name[], PetscErrorCode (*function)(PetscRandom))
975c6c1daeSBarry Smith {
985c6c1daeSBarry Smith   char           fullname[PETSC_MAX_PATH_LEN];
995c6c1daeSBarry Smith   PetscErrorCode ierr;
1005c6c1daeSBarry Smith 
1015c6c1daeSBarry Smith   PetscFunctionBegin;
102140e18c1SBarry Smith   ierr = PetscFunctionListConcat(path,name,fullname);CHKERRQ(ierr);
103140e18c1SBarry Smith   ierr = PetscFunctionListAdd(PETSC_COMM_WORLD,&PetscRandomList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr);
1045c6c1daeSBarry Smith   PetscFunctionReturn(0);
1055c6c1daeSBarry Smith }
1065c6c1daeSBarry Smith 
1075c6c1daeSBarry Smith 
1085c6c1daeSBarry Smith /*--------------------------------------------------------------------------------------------------------------------*/
1095c6c1daeSBarry Smith #undef __FUNCT__
1105c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomRegisterDestroy"
1115c6c1daeSBarry Smith /*@C
1125c6c1daeSBarry Smith    PetscRandomRegisterDestroy - Frees the list of Random types that were registered by PetscRandomRegister()/PetscRandomRegisterDynamic().
1135c6c1daeSBarry Smith 
1145c6c1daeSBarry Smith    Not Collective
1155c6c1daeSBarry Smith 
1165c6c1daeSBarry Smith    Level: advanced
1175c6c1daeSBarry Smith 
1185c6c1daeSBarry Smith .keywords: PetscRandom, register, destroy
1195c6c1daeSBarry Smith .seealso: PetscRandomRegister(), PetscRandomRegisterAll(), PetscRandomRegisterDynamic()
1205c6c1daeSBarry Smith @*/
1215c6c1daeSBarry Smith PetscErrorCode  PetscRandomRegisterDestroy(void)
1225c6c1daeSBarry Smith {
1235c6c1daeSBarry Smith   PetscErrorCode ierr;
1245c6c1daeSBarry Smith 
1255c6c1daeSBarry Smith   PetscFunctionBegin;
126140e18c1SBarry Smith   ierr = PetscFunctionListDestroy(&PetscRandomList);CHKERRQ(ierr);
127a297a907SKarl Rupp 
1285c6c1daeSBarry Smith   PetscRandomRegisterAllCalled = PETSC_FALSE;
1295c6c1daeSBarry Smith   PetscFunctionReturn(0);
1305c6c1daeSBarry Smith }
1315c6c1daeSBarry Smith 
1325c6c1daeSBarry Smith #if defined(PETSC_HAVE_RAND)
133*8cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand(PetscRandom);
1345c6c1daeSBarry Smith #endif
1355c6c1daeSBarry Smith #if defined(PETSC_HAVE_DRAND48)
136*8cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Rand48(PetscRandom);
1375c6c1daeSBarry Smith #endif
1385c6c1daeSBarry Smith #if defined(PETSC_HAVE_SPRNG)
139*8cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscRandomCreate_Sprng(PetscRandom);
1405c6c1daeSBarry Smith #endif
1415c6c1daeSBarry Smith 
1425c6c1daeSBarry Smith #undef __FUNCT__
1435c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomRegisterAll"
1445c6c1daeSBarry Smith /*@C
1455c6c1daeSBarry Smith   PetscRandomRegisterAll - Registers all of the components in the PetscRandom package.
1465c6c1daeSBarry Smith 
1475c6c1daeSBarry Smith   Not Collective
1485c6c1daeSBarry Smith 
1495c6c1daeSBarry Smith   Input parameter:
1505c6c1daeSBarry Smith . path - The dynamic library path
1515c6c1daeSBarry Smith 
1525c6c1daeSBarry Smith   Level: advanced
1535c6c1daeSBarry Smith 
1545c6c1daeSBarry Smith .keywords: PetscRandom, register, all
1555c6c1daeSBarry Smith .seealso:  PetscRandomRegister(), PetscRandomRegisterDestroy(), PetscRandomRegisterDynamic()
1565c6c1daeSBarry Smith @*/
1575c6c1daeSBarry Smith PetscErrorCode  PetscRandomRegisterAll(const char path[])
1585c6c1daeSBarry Smith {
1595c6c1daeSBarry Smith   PetscErrorCode ierr;
1605c6c1daeSBarry Smith 
1615c6c1daeSBarry Smith   PetscFunctionBegin;
1625c6c1daeSBarry Smith   PetscRandomRegisterAllCalled = PETSC_TRUE;
1635c6c1daeSBarry Smith #if defined(PETSC_HAVE_RAND)
1645c6c1daeSBarry Smith   ierr = PetscRandomRegisterDynamic(PETSCRAND,  path,"PetscRandomCreate_Rand",  PetscRandomCreate_Rand);CHKERRQ(ierr);
1655c6c1daeSBarry Smith #endif
1665c6c1daeSBarry Smith #if defined(PETSC_HAVE_DRAND48)
1675c6c1daeSBarry Smith   ierr = PetscRandomRegisterDynamic(PETSCRAND48,path,"PetscRandomCreate_Rand48",PetscRandomCreate_Rand48);CHKERRQ(ierr);
1685c6c1daeSBarry Smith #endif
1695c6c1daeSBarry Smith #if defined(PETSC_HAVE_SPRNG)
1705c6c1daeSBarry Smith   ierr = PetscRandomRegisterDynamic(PETSCSPRNG,path,"PetscRandomCreate_Sprng",PetscRandomCreate_Sprng);CHKERRQ(ierr);
1715c6c1daeSBarry Smith #endif
1725c6c1daeSBarry Smith   PetscFunctionReturn(0);
1735c6c1daeSBarry Smith }
1745c6c1daeSBarry Smith 
175