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