xref: /petsc/src/sys/classes/random/impls/sprng/sprng.c (revision b6bfaf9a0a178e626c17e7b8aafd5e3bedcd9a6d)
15c6c1daeSBarry Smith 
2*b6bfaf9aSBarry Smith #include <../src/sys/classes/random/randomimpl.h>
35c6c1daeSBarry Smith #if defined (PETSC_HAVE_STDLIB_H)
45c6c1daeSBarry Smith #include <stdlib.h>
55c6c1daeSBarry Smith #endif
65c6c1daeSBarry Smith 
75c6c1daeSBarry Smith #define USE_MPI
85c6c1daeSBarry Smith #define SIMPLE_SPRNG
95c6c1daeSBarry Smith EXTERN_C_BEGIN
105c6c1daeSBarry Smith #include <sprng.h>
115c6c1daeSBarry Smith EXTERN_C_END
125c6c1daeSBarry Smith 
135c6c1daeSBarry Smith #undef __FUNCT__
145c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomSeed_Sprng"
155c6c1daeSBarry Smith PetscErrorCode  PetscRandomSeed_Sprng(PetscRandom r)
165c6c1daeSBarry Smith {
175c6c1daeSBarry Smith   PetscFunctionBegin;
185c6c1daeSBarry Smith   init_sprng(r->seed,SPRNG_DEFAULT);
195c6c1daeSBarry Smith   PetscFunctionReturn(0);
205c6c1daeSBarry Smith }
215c6c1daeSBarry Smith 
225c6c1daeSBarry Smith #undef __FUNCT__
235c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomGetValue_Sprng"
245c6c1daeSBarry Smith PetscErrorCode  PetscRandomGetValue_Sprng(PetscRandom r,PetscScalar *val)
255c6c1daeSBarry Smith {
265c6c1daeSBarry Smith   PetscFunctionBegin;
275c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
285c6c1daeSBarry Smith   if (r->iset) {
29b0043f70SBarry Smith     *val = PetscRealPart(r->width)*sprng() + PetscRealPart(r->low) +  (PetscImaginaryPart(r->width)*sprng() + PetscImaginaryPart(r->low)) * PETSC_i;
305c6c1daeSBarry Smith   } else {
315c6c1daeSBarry Smith     *val = sprng() + sprng()*PETSC_i;
325c6c1daeSBarry Smith   }
335c6c1daeSBarry Smith #else
345c6c1daeSBarry Smith   if (r->iset) *val = r->width * sprng() + r->low;
355c6c1daeSBarry Smith   else         *val = sprng();
365c6c1daeSBarry Smith #endif
375c6c1daeSBarry Smith   PetscFunctionReturn(0);
385c6c1daeSBarry Smith }
395c6c1daeSBarry Smith 
405c6c1daeSBarry Smith #undef __FUNCT__
415c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomGetValue_Sprng"
425c6c1daeSBarry Smith PetscErrorCode  PetscRandomGetValueReal_Sprng(PetscRandom r,PetscScalar *val)
435c6c1daeSBarry Smith {
445c6c1daeSBarry Smith   PetscFunctionBegin;
455c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX)
465c6c1daeSBarry Smith   if (r->iset) *val = PetscRealPart(r->width)*sprng() + PetscRealPart(r->low);
475c6c1daeSBarry Smith   else         *val = sprng();
485c6c1daeSBarry Smith #else
495c6c1daeSBarry Smith   if (r->iset) *val = r->width * sprng() + r->low;
505c6c1daeSBarry Smith   else         *val = sprng();
515c6c1daeSBarry Smith #endif
525c6c1daeSBarry Smith   PetscFunctionReturn(0);
535c6c1daeSBarry Smith }
545c6c1daeSBarry Smith 
555c6c1daeSBarry Smith static struct _PetscRandomOps PetscRandomOps_Values = {
565c6c1daeSBarry Smith   /* 0 */
575c6c1daeSBarry Smith   PetscRandomSeed_Sprng,
585c6c1daeSBarry Smith   PetscRandomGetValue_Sprng,
595c6c1daeSBarry Smith   PetscRandomGetValueReal_Sprng,
605c6c1daeSBarry Smith   0,
615c6c1daeSBarry Smith   /* 5 */
625c6c1daeSBarry Smith   0
635c6c1daeSBarry Smith };
645c6c1daeSBarry Smith 
655c6c1daeSBarry Smith /*MC
665c6c1daeSBarry Smith    PETSCSPRNG- access to the publically available random number generator sprng
675c6c1daeSBarry Smith 
685c6c1daeSBarry Smith    Options Database Keys:
695c6c1daeSBarry Smith . -random_type <rand,rand48,sprng>
705c6c1daeSBarry Smith 
715c6c1daeSBarry Smith   Level: beginner
725c6c1daeSBarry Smith 
735c6c1daeSBarry Smith    PETSc must have been ./configure with the option --download-sprng to use
745c6c1daeSBarry Smith    this random number generator.
755c6c1daeSBarry Smith 
765c6c1daeSBarry Smith    This is NOT currently using a parallel random number generator. Sprng does have
775c6c1daeSBarry Smith    an MPI version we should investigate.
785c6c1daeSBarry Smith 
795c6c1daeSBarry Smith .seealso: RandomCreate(), RandomSetType(), PETSCRAND, PETSCRAND48
805c6c1daeSBarry Smith M*/
815c6c1daeSBarry Smith 
825c6c1daeSBarry Smith EXTERN_C_BEGIN
835c6c1daeSBarry Smith #undef __FUNCT__
845c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomCreate_Sprng"
855c6c1daeSBarry Smith PetscErrorCode  PetscRandomCreate_Sprng(PetscRandom r)
865c6c1daeSBarry Smith {
875c6c1daeSBarry Smith   PetscErrorCode ierr;
885c6c1daeSBarry Smith 
895c6c1daeSBarry Smith   PetscFunctionBegin;
905c6c1daeSBarry Smith   ierr = PetscMemcpy(r->ops,&PetscRandomOps_Values,sizeof(PetscRandomOps_Values));CHKERRQ(ierr);
915c6c1daeSBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)r,PETSCSPRNG);CHKERRQ(ierr);
925c6c1daeSBarry Smith   PetscFunctionReturn(0);
935c6c1daeSBarry Smith }
945c6c1daeSBarry Smith EXTERN_C_END
95