Actual source code: sprng.c

  1: #define PETSC_DLL

  3: #include "src/sys/utils/random/randomimpl.h"
  4: #if defined (PETSC_HAVE_STDLIB_H)
  5: #include <stdlib.h>
  6: #endif

  8: #define USE_MPI
  9: #define SIMPLE_SPRNG
 11: #include "sprng.h"

 16: PetscErrorCode  PetscRandomSeed_Sprng(PetscRandom r)
 17: {
 19:   init_sprng(r->seed,SPRNG_DEFAULT);
 20:   return(0);
 21: }

 25: PetscErrorCode  PetscRandomGetValue_Sprng(PetscRandom r,PetscScalar *val)
 26: {
 28: #if defined(PETSC_USE_COMPLEX)  
 29:   if (r->iset) {
 30:     *val = PetscRealPart(r->width)*sprng() + PetscRealPart(r->low) +
 31:       (PetscImaginaryPart(r->width)*sprng() + PetscImaginaryPart(r->low)) * PETSC_i;
 32:   } else {
 33:     *val = sprng() + sprng()*PETSC_i;
 34:   }
 35: #else
 36:   if (r->iset) *val = r->width * sprng() + r->low;
 37:   else         *val = sprng();
 38: #endif
 39:   return(0);
 40: }

 44: PetscErrorCode  PetscRandomGetValueReal_Sprng(PetscRandom r,PetscScalar *val)
 45: {
 47: #if defined(PETSC_USE_COMPLEX)
 48:   if (r->iset) *val = PetscRealPart(r->width)*sprng() + PetscRealPart(r->low);
 49:   else         *val = sprng();
 50: #else
 51:   if (r->iset) *val = r->width * sprng() + r->low;
 52:   else         *val = sprng();
 53: #endif
 54:   return(0);
 55: }

 59: PetscErrorCode  PetscRandomGetValueImaginary_Sprng(PetscRandom r,PetscScalar *val)
 60: {
 62: #if defined(PETSC_USE_COMPLEX)
 63:   if (r->iset) *val = (PetscImaginaryPart(r->width)*sprng()+PetscImaginaryPart(r->low))*PETSC_i;
 64:   else         *val = sprng()*PETSC_i;
 65: #else
 66:   if (r->iset) *val = r->width * sprng() + r->low;
 67:   else         *val = sprng();
 68: #endif
 69:   return(0);
 70: }

 72: static struct _PetscRandomOps PetscRandomOps_Values = {
 73:   /* 0 */
 74:   PetscRandomSeed_Sprng,
 75:   PetscRandomGetValue_Sprng,
 76:   PetscRandomGetValueReal_Sprng,
 77:   PetscRandomGetValueImaginary_Sprng,
 78:   0,
 79:   /* 5 */
 80:   0
 81: };

 86: PetscErrorCode  PetscRandomCreate_Sprng(PetscRandom r)
 87: {

 91:   PetscMemcpy(r->ops,&PetscRandomOps_Values,sizeof(PetscRandomOps_Values));
 92:   PetscObjectChangeTypeName((PetscObject)r,SPRNG);
 93:   PetscPublishAll(r);
 94:   return(0);
 95: }