15c6c1daeSBarry Smith 25c6c1daeSBarry 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 #undef __FUNCT__ 85c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomSeed_Rand48" 95c6c1daeSBarry Smith PetscErrorCode PetscRandomSeed_Rand48(PetscRandom r) 105c6c1daeSBarry Smith { 115c6c1daeSBarry Smith PetscFunctionBegin; 125c6c1daeSBarry Smith srand48(r->seed); 135c6c1daeSBarry Smith PetscFunctionReturn(0); 145c6c1daeSBarry Smith } 155c6c1daeSBarry Smith 165c6c1daeSBarry Smith #undef __FUNCT__ 175c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomGetValue_Rand48" 185c6c1daeSBarry Smith PetscErrorCode PetscRandomGetValue_Rand48(PetscRandom r,PetscScalar *val) 195c6c1daeSBarry Smith { 205c6c1daeSBarry Smith PetscFunctionBegin; 215c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX) 225c6c1daeSBarry Smith if (r->iset) { 23*b0043f70SBarry Smith *val = PetscRealPart(r->width)*(PetscReal)drand48() + PetscRealPart(r->low) + (PetscImaginaryPart(r->width)*(PetscReal)drand48() + PetscImaginaryPart(r->low)) * PETSC_i; 245c6c1daeSBarry Smith } else { 255c6c1daeSBarry Smith *val = (PetscReal)drand48() + (PetscReal)drand48()*PETSC_i; 265c6c1daeSBarry Smith } 275c6c1daeSBarry Smith #else 285c6c1daeSBarry Smith if (r->iset) *val = r->width * drand48() + r->low; 295c6c1daeSBarry Smith else *val = drand48(); 305c6c1daeSBarry Smith #endif 315c6c1daeSBarry Smith PetscFunctionReturn(0); 325c6c1daeSBarry Smith } 335c6c1daeSBarry Smith 345c6c1daeSBarry Smith #undef __FUNCT__ 355c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomGetValueReal_Rand48" 365c6c1daeSBarry Smith PetscErrorCode PetscRandomGetValueReal_Rand48(PetscRandom r,PetscReal *val) 375c6c1daeSBarry Smith { 385c6c1daeSBarry Smith PetscFunctionBegin; 395c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX) 405c6c1daeSBarry Smith if (r->iset) *val = PetscRealPart(r->width)*drand48() + PetscRealPart(r->low); 415c6c1daeSBarry Smith else *val = drand48(); 425c6c1daeSBarry Smith #else 435c6c1daeSBarry Smith if (r->iset) *val = r->width * drand48() + r->low; 445c6c1daeSBarry Smith else *val = drand48(); 455c6c1daeSBarry Smith #endif 465c6c1daeSBarry Smith PetscFunctionReturn(0); 475c6c1daeSBarry Smith } 485c6c1daeSBarry Smith 495c6c1daeSBarry Smith static struct _PetscRandomOps PetscRandomOps_Values = { 505c6c1daeSBarry Smith /* 0 */ 515c6c1daeSBarry Smith PetscRandomSeed_Rand48, 525c6c1daeSBarry Smith PetscRandomGetValue_Rand48, 535c6c1daeSBarry Smith PetscRandomGetValueReal_Rand48, 545c6c1daeSBarry Smith 0, 555c6c1daeSBarry Smith /* 5 */ 565c6c1daeSBarry Smith 0 575c6c1daeSBarry Smith }; 585c6c1daeSBarry Smith 595c6c1daeSBarry Smith /*MC 605c6c1daeSBarry Smith PETSCRAND48 - access to the basic Unix drand48() random number generator 615c6c1daeSBarry Smith 625c6c1daeSBarry Smith Options Database Keys: 635c6c1daeSBarry Smith . -random_type <rand,rand48,sprng> 645c6c1daeSBarry Smith 655c6c1daeSBarry Smith Level: beginner 665c6c1daeSBarry Smith 675c6c1daeSBarry Smith .seealso: RandomCreate(), RandomSetType(), PETSCRAND, PETSCSPRNG 685c6c1daeSBarry Smith M*/ 695c6c1daeSBarry Smith 705c6c1daeSBarry Smith EXTERN_C_BEGIN 715c6c1daeSBarry Smith #undef __FUNCT__ 725c6c1daeSBarry Smith #define __FUNCT__ "PetscRandomCreate_Rand48" 735c6c1daeSBarry Smith PetscErrorCode PetscRandomCreate_Rand48(PetscRandom r) 745c6c1daeSBarry Smith { 755c6c1daeSBarry Smith PetscErrorCode ierr; 765c6c1daeSBarry Smith 775c6c1daeSBarry Smith PetscFunctionBegin; 785c6c1daeSBarry Smith ierr = PetscMemcpy(r->ops,&PetscRandomOps_Values,sizeof(PetscRandomOps_Values));CHKERRQ(ierr); 795c6c1daeSBarry Smith /* r->bops->publish = PetscRandomPublish; */ 805c6c1daeSBarry Smith /* r->petscnative = PETSC_TRUE; */ 815c6c1daeSBarry Smith 825c6c1daeSBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)r,PETSCRAND48);CHKERRQ(ierr); 835c6c1daeSBarry Smith PetscFunctionReturn(0); 845c6c1daeSBarry Smith } 855c6c1daeSBarry Smith EXTERN_C_END 86