Example #1
0
void MD_InitParticles(void* params){
  printf("MD_InitParticles: Params: %p\n", params);
 // return; 
  
  //Params| &table | box[] | seed |
  //Bytes |   8    | 8*nd  |  4   |
  
  void *table = *((void**)params); 

  //Unpack Table  
  int np = *((int*)table);
  int nd = *(((int*)table) + 1);
  double *pos = ((double*)table) + 2;
 
  //Unpack Params
  double *box = (double*)(((void**)params)+1);
  int *seed = (int*)(box + nd);

  int i,j; 
  //Update values
  for ( j = 0; j < np ; j++){
    for ( i = 0; i < nd ; i++){
      printf("MD_InitParticles: Writting to pos @ i=%d, j=%d, nd=%d: %d", i, j, nd, i+j*nd);
      pos[i+j*nd] = box[i] * r8_uniform_01(seed);
    }
  }
}
Example #2
0
void initialize ( int np, int nd, double box[], int *seed, double pos[], 
  double vel[], double acc[] )

/******************************************************************************/
/*
  Purpose:

    INITIALIZE initializes the positions, velocities, and accelerations.

  Licensing:

    This code is distributed under the GNU LGPL license. 

  Modified:

    20 July 2008

  Author:

    Original FORTRAN90 version by Bill Magro.
    C version by John Burkardt.

  Parameters:

    Input, int NP, the number of particles.

    Input, int ND, the number of spatial dimensions.

    Input, double BOX[ND], specifies the maximum position
    of particles in each dimension.

    Input, int *SEED, a seed for the random number generator.

    Output, double POS[ND*NP], the position of each particle.

    Output, double VEL[ND*NP], the velocity of each particle.

    Output, double ACC[ND*NP], the acceleration of each particle.
*/
{
  int i;
  int j;
/*
  Give the particles random positions within the box.
*/
  for ( j = 0; j < np; j++ )
  {
    for ( i = 0; i < nd; i++ )
    {
      pos[i+j*nd] = box[i] * r8_uniform_01 ( seed );
      vel[i+j*nd] = 0.0;
      acc[i+j*nd] = 0.0;
    }
  }
  return;
}
int poisson_fixed_time ( double lambda, double time, int *seed )

/******************************************************************************/
/*
  Purpose:

    POISSON_FIXED_TIME counts the Poisson events in a fied time.

  Licensing:

    This code is distributed under the GNU LGPL license.

  Modified:

    28 September 2012

  Author:

    John Burkardt

  Parameters:

    Input, double LAMBDA, the average number of events 
    per unit time.

    Input, double TIME, the amount of time to observe.

    Input/output, int *SEED, a seed for the random
    number generator.

    Output, int POISSON_FIXED_TIME, the number of Poisson events observed.
*/
{
  double dt;
  int n;
  double t;
  double u;

  n = 0;
  t = 0.0;

  while ( t < time )
  {
    u = r8_uniform_01 ( seed );
    dt = - log ( u ) / lambda;
    n = n + 1;
    t = t + dt;
  }

  return n;
}
void test03 ( )

/******************************************************************************/
/*
  Purpose:

    TEST03 tests the Partition-of-Unity property.

  Licensing:

    This code is distributed under the GNU LGPL license. 

  Modified:

    11 February 2012

  Author:

    John Burkardt
*/
{
  double *bvec;
  int n;
  int n_data;
  int seed;
  double x;

  printf ( "\n" );
  printf ( "TEST03:\n" );
  printf ( "  BERNSTEIN_POLY evaluates the Bernstein polynomials\n" );
  printf ( "  based on the interval [0,1].\n" );
  printf ( "\n" );
  printf ( "  Here we test the partition of unity property.\n" );
  printf ( "\n" );
  printf ( "     N     X          Sum ( 0 <= K <= N ) BP01(N,K)(X)\n" );
  printf ( "\n" );

  seed = 123456789;

  for ( n = 0; n <= 10; n++ )
  {
    x = r8_uniform_01 ( &seed );

    bvec = bernstein_poly_01 ( n, x );

    printf ( "  %4d  %7f  %14g\n", n, x, r8vec_sum ( n + 1, bvec ) );

    free ( bvec );
  }
  return;
}
Example #5
0
int *life_init ( double prob, int m, int n, int *seed )

/******************************************************************************/
/*
  Purpose:

    LIFE_INIT initializes the life grid.

  Licensing:

    This code is distributed under the GNU LGPL license.

  Modified:

    08 September 2013

  Author:

    John Burkardt

  Parameters:

    Input, double PROB, the probability that a grid cell
    should be alive.

    Input, int M, N, the number of rows and columns
    of interior grid cells.

    Input/output, int *SEED, a seed for the random
    number generator.

    Output, int LIFE_INIT[(1+M+1)*(1+N+1)], the initial grid.
*/
{
  int *grid;
  int i;
  int j;
  double r;

  grid = ( int * ) malloc ( ( m + 2 ) * ( n + 2 ) * sizeof ( int ) );
  for ( j = 0; j <= n + 1; j++ )
  {
    for ( i = 0; i <= m + 1; i++ )
    {
      grid[i+j*(m+2)] = 0;
    }
  }

  for ( j = 1; j <= n; j++ )
  {
    for ( i = 1; i <= m; i++ )
    {
      r = r8_uniform_01 ( seed );
      if ( r <= prob )
      {
        grid[i+j*(m+2)] = 1;
      }
    }
  }

  return grid;
}
double *polygon_sample ( int nv, double v[], int n, int *seed )

/******************************************************************************/
/*
  Purpose:

    POLYGON_SAMPLE uniformly samples a polygon.

  Licensing:

    This code is distributed under the GNU LGPL license.

  Modified:

    07 May 2014

  Author:

    John Burkardt

  Parameters:

    Input, int NV, the number of vertices.

    Input, double V[2*NV], the vertices of the polygon, listed in
    counterclockwise order.

    Input, int N, the number of points to create.

    Input/output, int *SEED, a seed for the random
    number generator.

    Output, double POLYGON_SAMPLE[2*N], the points.
*/
{
  double *area_cumulative;
  double area_polygon;
  double *area_relative;
  double *area_triangle;
  double area_percent;
  int i;
  int ip1;
  int j;
  int k;
  double *r;
  double *s;
  int *triangles;
  double *x;
  double *y;
/*
  Triangulate the polygon.
*/
  x = ( double * ) malloc ( nv * sizeof ( double ) );
  y = ( double * ) malloc ( nv * sizeof ( double ) );
  for ( i = 0; i < nv; i++ )
  {
    x[i] = v[0+i*2];
    y[i] = v[1+i*2];
  }

  triangles = polygon_triangulate ( nv, x, y );
/*
  Determine the areas of each triangle.
*/
  area_triangle = ( double * ) malloc ( ( nv - 2 ) * sizeof ( double ) );

  for ( i = 0; i < nv - 2; i++ )
  {
    area_triangle[i] = triangle_area ( 
      v[0+triangles[0+i*3]*2], v[1+triangles[0+i*3]*2], 
      v[0+triangles[1+i*3]*2], v[1+triangles[1+i*3]*2], 
      v[0+triangles[2+i*3]*2], v[1+triangles[2+i*3]*2] );
  }
/*
  Normalize the areas.
*/
  area_polygon = r8vec_sum ( nv - 2, area_triangle );

  area_relative = ( double * ) malloc ( ( nv - 2 ) * sizeof ( double ) );
  for ( i = 0; i < nv - 2; i++ )
  {
    area_relative[i] = area_triangle[i] / area_polygon;
  }
/*
  Replace each area by the sum of itself and all previous ones.
*/
  area_cumulative = ( double * ) malloc ( ( nv - 2 ) * sizeof ( double ) );
  area_cumulative[0] = area_relative[0];
  for ( i = 1; i < nv - 2; i++ )
  {
    area_cumulative[i] = area_relative[i] + area_cumulative[i-1];
  }

  s = ( double * ) malloc ( 2 * n * sizeof ( double ) );

  for ( j = 0; j < n; j++ )
  {
/*
  Choose triangle I at random, based on areas.
*/
    area_percent = r8_uniform_01 ( seed );

    for ( k = 0; k < nv - 2; k++ )
    {
      i = k;

      if ( area_percent <= area_cumulative[k] )
      {
        break;
      }
    }
/*
  Now choose a point at random in triangle I.
*/
    r = r8vec_uniform_01_new ( 2, seed );

    if ( 1.0 < r[0] + r[1] )
    {
      r[0] = 1.0 - r[0];
      r[1] = 1.0 - r[1];
    }

    s[0+j*2] = ( 1.0 - r[0] - r[1] ) * v[0+triangles[0+i*3]*2]
                     + r[0]          * v[0+triangles[1+i*3]*2]
                            + r[1]   * v[0+triangles[2+i*3]*2];

    s[1+j*2] = ( 1.0 - r[0] - r[1] ) * v[1+triangles[0+i*3]*2]
                     + r[0]          * v[1+triangles[1+i*3]*2]
                            + r[1]   * v[1+triangles[2+i*3]*2];
    free ( r );
  }

  free ( area_cumulative );
  free ( area_relative );
  free ( area_triangle );
  free ( triangles );
  free ( x );
  free ( y );

  return s;
}
Example #7
0
double r8_normal_01 ( int *seed )

/******************************************************************************/
/*
  Purpose:

    R8_NORMAL_01 returns a unit pseudonormal R8.

  Discussion:

    The standard normal probability distribution function (PDF) has 
    mean 0 and standard deviation 1.

    Because this routine uses the Box Muller method, it requires pairs
    of uniform random values to generate a pair of normal random values.
    This means that on every other call, the code can use the second
    value that it calculated.

    However, if the user has changed the SEED value between calls,
    the routine automatically resets itself and discards the saved data.

  Licensing:

    This code is distributed under the GNU LGPL license. 

  Modified:

    10 June 2010

  Author:

    John Burkardt

  Parameters:

    Input/output, int *SEED, a seed for the random number generator.

    Output, double R8_NORMAL_01, a normally distributed random value.
*/
{
# define R8_PI 3.141592653589793

  double r1;
  double r2;
  static int seed1 = 0;
  static int seed2 = 0;
  static int seed3 = 0;
  static int used = 0;
  double v1;
  static double v2 = 0.0;
/*
  If USED is odd, but the input SEED does not match
  the output SEED on the previous call, then the user has changed
  the seed.  Wipe out internal memory.
*/
  if ( ( used % 2 ) == 1 )
  {
    if ( *seed != seed2 )
    {
      used = 0;
      seed1 = 0;
      seed2 = 0;
      seed3 = 0;
      v2 = 0.0;
    }
  }
/*
  If USED is even, generate two uniforms, create two normals,
  return the first normal and its corresponding seed.
*/
  if ( ( used % 2 )== 0 )
  {
    seed1 = *seed;

    r1 = r8_uniform_01 ( seed );

    if ( r1 == 0.0 )
    {
      printf ( "\n" );
      printf ( "R8_NORMAL_01 - Fatal error!\n" );
      printf ( "  R8_UNIFORM_01 returned a value of 0.\n" );
      exit ( 1 );
    }

    seed2 = *seed;
    r2 = r8_uniform_01 ( seed );
    seed3 = *seed;
    *seed = seed2;

    v1 = sqrt ( - 2.0 * log ( r1 ) ) * cos ( 2.0 * R8_PI * r2 );
    v2 = sqrt ( - 2.0 * log ( r1 ) ) * sin ( 2.0 * R8_PI * r2 );
  }
/*
  If USED is odd (and the input SEED matched the output value from
  the previous call), return the second normal and its corresponding seed.
*/
  else
  {
    v1 = v2;
    *seed = seed3;
  }

  used = used + 1;

  return v1;
# undef R8_PI
}
Example #8
0
void rcont2 ( int nrow, int ncol, int nrowt[], int ncolt[], int *key,
  int *seed, int matrix[],  int *ierror )

/******************************************************************************/
/*
  Purpose:

    RCONT2 constructs a random two-way contingency table with given sums.

  Discussion:

    It is possible to specify row and column sum vectors which
    correspond to no table at all.  As far as I can see, this routine does
    not detect such a case.

  Licensing:

    This code is distributed under the GNU LGPL license.

  Modified:

    12 November 2010

  Author:

    Original FORTRAN77 version by WM Patefield.
    C version by John Burkardt.

  Reference:

    WM Patefield,
    Algorithm AS 159:
    An Efficient Method of Generating RXC Tables with
    Given Row and Column Totals,
    Applied Statistics,
    Volume 30, Number 1, 1981, pages 91-97.

  Parameters:

    Input, int NROW, NCOL, the number of rows and columns
    in the table.  NROW and NCOL must each be at least 2.

    Input, int NROWT[NROW], NCOLT[NCOL], the row and column
    sums.  Each entry must be positive.

    Input/output, int *KEY, a flag that indicates whether data has
    been initialized for this problem.  Set KEY = .FALSE. before the first
    call.

    Input/output, int *SEED, a seed for the random number generator.

    Output, int MATRIX[NROW*NCOL], the matrix.

    Output, int *IERROR, an error flag, which is returned
    as 0 if no error occurred.
*/
{
  int done1;
  int done2;
  static double *fact = NULL;
  int i;
  int ia;
  int iap;
  int ib;
  int ic;
  int id;
  int idp;
  int ie;
  int igp;
  int ihp;
  int ii;
  int iip;
  int j;
  int jc;
  int *jwork;
  int l;
  int lsm;
  int lsp;
  int m;
  int nll;
  int nlm;
  int nlmp;
  int nrowtl;
  static int ntotal = 0;
  double r;
  double sumprb;
  double x;
  double y;

  *ierror = 0;
/*
  On user's signal, set up the factorial table.
*/
  if ( !(*key) )
  {

    *key = 1;

    if ( nrow <= 1 )
    {
      printf ( "\n" );
      printf ( "RCONT - Fatal error!\n" );
      printf ( "  Input number of rows is less than 2.\n" );
      *ierror = 1;
      return;
    }

    if ( ncol <= 1 )
    {
      printf ( "\n" );
      printf ( "RCONT - Fatal error!\n" );
      printf ( "  The number of columns is less than 2.\n" );
      *ierror = 2;
      return;
    }

    for ( i = 0; i < nrow; i++ )
    {
      if ( nrowt[i] <= 0 )
      {
        printf ( "\n" );
        printf ( "RCONT - Fatal error!\n" );
        printf ( "  An entry in the row sum vector is not positive.\n" );
        *ierror = 3;
        return;
      }
    }

    for ( j = 0; j < ncol; j++ )
    {
      if ( ncolt[j] <= 0 )
      {
        printf ( "\n" );
        printf ( "RCONT - Fatal error!\n" );
        printf ( "  An entry in the column sum vector is not positive.\n" );
        *ierror = 4;
        return;
      }
    }

    if ( i4vec_sum ( ncol, ncolt ) != i4vec_sum ( nrow, nrowt ) )
    {
      printf ( "\n" );
      printf ( "RCONT - Fatal error!\n" );
      printf ( "  The row and column sum vectors do not have the same sum.\n" );
      *ierror = 6;
      return;
    }

    ntotal = i4vec_sum ( ncol, ncolt );

    if ( fact )
    {
      free ( fact );
    }

    fact = ( double * ) malloc ( ( ntotal + 1 ) * sizeof ( double ) );
/*
  Calculate log-factorials.
*/
    x = 0.0;
    fact[0] = 0.0;
    for ( i = 1; i <= ntotal; i++ )
    {
      x = x + log ( ( double ) ( i ) );
      fact[i] = x;
    }

  }
/*
  Construct a random matrix.
*/
  jwork = ( int * ) malloc ( ncol * sizeof ( int ) );;

  for ( i = 0; i < ncol - 1; i++ )
  {
    jwork[i] = ncolt[i];
  }

  jc = ntotal;

  for ( l = 0; l < nrow - 1; l++ )
  {
    nrowtl = nrowt[l];
    ia = nrowtl;
    ic = jc;
    jc = jc - nrowtl;

    for ( m = 0; m < ncol - 1; m++ )
    {
      id = jwork[m];
      ie = ic;
      ic = ic - id;
      ib = ie - ia;
      ii = ib - id;
/*
  Test for zero entries in matrix.
*/
      if ( ie == 0 )
      {
        ia = 0;
        for ( j = m; j < ncol; j++ )
        {
          matrix[l+j*nrow] = 0;
        }
        break;
      }
/*
  Generate a pseudo-random number.
*/
      r = r8_uniform_01 ( seed );
/*
  Compute the conditional expected value of MATRIX(L,M).
*/
      done1 = 0;

      for ( ; ; )
      {
        nlm = ( int ) ( ( double ) ( ia * id ) / ( double ) ( ie ) + 0.5 );
        iap = ia + 1;
        idp = id + 1;
        igp = idp - nlm;
        ihp = iap - nlm;
        nlmp = nlm + 1;
        iip = ii + nlmp;
        x = exp ( fact[iap-1] + fact[ib] + fact[ic] + fact[idp-1] -
          fact[ie] - fact[nlmp-1] - fact[igp-1] - fact[ihp-1] - fact[iip-1] );

        if ( r <= x )
        {
          break;
        }

        sumprb = x;
        y = x;
        nll = nlm;
        lsp = 0;
        lsm = 0;
/*
  Increment entry in row L, column M.
*/
        while ( !lsp )
        {
          j = ( id - nlm ) * ( ia - nlm );

          if ( j == 0 )
          {
            lsp = 1;
          }
          else
          {
            nlm = nlm + 1;
            x = x * ( double ) ( j ) / ( double ) ( nlm * ( ii + nlm ) );
            sumprb = sumprb + x;

            if ( r <= sumprb )
            {
              done1 = 1;
              break;
            }
          }

          done2 = 0;

          while ( !lsm )
          {
/*
  Decrement the entry in row L, column M.
*/
            j = nll * ( ii + nll );

            if ( j == 0 )
            {
              lsm = 1;
              break;
            }

            nll = nll - 1;
            y = y * ( double ) ( j ) / ( double ) ( ( id - nll ) * ( ia - nll ) );
            sumprb = sumprb + y;

            if ( r <= sumprb )
            {
              nlm = nll;
              done2 = 1;
              break;
            }

            if ( !lsp )
            {
              break;
            }

          }

          if ( done2 )
          {
            break;
          }

        }

        if ( done1 )
        {
          break;
        }

        if ( done2 )
        {
          break;
        }

        r = r8_uniform_01 ( seed );
        r = sumprb * r;

      }

      matrix[l+m*nrow] = nlm;
      ia = ia - nlm;
      jwork[m] = jwork[m] - nlm;

    }
    matrix[l+(ncol-1)*nrow] = ia;
  }
/*
  Compute the last row.
*/
  for ( j = 0; j < ncol - 1; j++ )
  {
    matrix[nrow-1+j*nrow] = jwork[j];
  }
  matrix[nrow-1+(ncol-1)*nrow] = ib - matrix[nrow-1+(ncol-2)*nrow];

  free ( jwork );

  return;
}
Example #9
0
void rnorm ( int *seed, double *u1, double *u2 )

/******************************************************************************/
/*
  Purpose:

    RNORM returns two independent standard random normal deviates.

  Discussion:

    This routine sets U1 and U2 to two independent standardized 
    random normal deviates.   This is a version of the 
    method given in Knuth.

  Licensing:

    This code is distributed under the GNU LGPL license.

  Modified:

    16 April 2014

  Author:

    Original FORTRAN77 version by William Smith, Ronald Hocking.
    This C version by John Burkardt.

  Reference:

    Donald Knuth,
    The Art of Computer Programming,
    Volume 2, Seminumerical Algorithms,
    Third Edition,
    Addison Wesley, 1997,
    ISBN: 0201896842,
    LC: QA76.6.K64.

  Parameters:

    Input/output, int *SEED, a seed for the random 
    number generator.

    Output, double *U1, *U2, two standard random normal deviates.
*/
{
  double s;
  double x;
  double y;

  for ( ; ; )
  {
    x = r8_uniform_01 ( seed );
    y = r8_uniform_01 ( seed );
    x = 2.0 * x - 1.0;
    y = 2.0 * y - 1.0;
    s = x * x + y * y;

    if ( s <= 1.0 )
    {
      s = sqrt ( - 2.0 * log ( s ) / s );
      *u1 = x * s;
      *u2 = y * s;
      break;
    }
  }
  return;
}
void test15 ( )

/******************************************************************************/
/*
  Purpose:

    TEST15 tests PHYSICAL_TO_REFERENCE_T3 and REFERENCE_TO_PHYSICAL_T3.

  Licensing:

    This code is distributed under the GNU LGPL license. 

  Modified:

    15 January 2013

  Author:

    John Burkardt
*/
{
# define N 10

  int i;
  int j;
  double phy[2*N];
  double ref[2*N];
  double ref2[2*N];
  int seed;
  double t[2*3] = {
    1.0, 1.0, 
    3.0, 1.0, 
    2.0, 5.0 };

  seed = 123456789;

  printf ( "\n" );
  printf ( "TEST15\n" );
  printf ( "  For an order 3 triangle,\n" );
  printf ( "  PHYSICAL_TO_REFERENCE_T3 maps a physical point to\n" );
  printf ( "  a reference point.\n" );
  printf ( "  REFERENCE_TO_PHYSICAL_T3 maps a reference point to\n" );
  printf ( "  a physical point.\n" );
  printf ( "\n" );
  printf ( "      XSI     ETA  ==>  X       Y    ==>  XSI2    ETA2\n" );
  printf ( "\n" );

  for ( j = 0; j < N; j++ )
  {
    for ( i = 0; i < 2; i++ )
    {
      ref[i+j*2] = r8_uniform_01 ( &seed );
    }

    if ( 1.0 < ref[0+j*2] + ref[1+j*2] )
    {
      ref[0+j*2] = 1.0 - ref[0+j*2];
      ref[1+j*2] = 1.0 - ref[1+j*2];
    }
  }

  reference_to_physical_t3 ( t, N, ref, phy );

  physical_to_reference_t3 ( t, N, phy, ref2 );

  for ( j = 0; j < N; j++ )
  {
    printf ( "  %10f  %10f  %10f  %10f  %10f  %10f\n",
     ref[0+j*2], ref[1+j*2], phy[0+j*2], phy[1+j*2], ref2[0+j*2], ref2[1+j*2] );
  }

  return;
# undef N
}
Example #11
0
double *wathen_st ( int nx, int ny, int nz_num, int *seed, int row[], 
  int col[] )

/******************************************************************************/
/*
  Purpose:

    WATHEN_ST: Wathen matrix stored in sparse triplet (ST) format.

  Discussion:

    When dealing with sparse matrices in MATLAB, it can be much more efficient
    to work first with a triple of I, J, and X vectors, and only once
    they are complete, convert to MATLAB's sparse format.

    The Wathen matrix is a finite element matrix which is sparse.

    The entries of the matrix depend in part on a physical quantity
    related to density.  That density is here assigned random values between
    0 and 100.

    The matrix order N is determined by the input quantities NX and NY,
    which would usually be the number of elements in the X and Y directions.

    The value of N is

      N = 3*NX*NY + 2*NX + 2*NY + 1,

    The matrix is the consistent mass matrix for a regular NX by NY grid
    of 8 node serendipity elements.

    The local element numbering is

      3--2--1
      |     |
      4     8
      |     |
      5--6--7

    Here is an illustration for NX = 3, NY = 2:

     23-24-25-26-27-28-29
      |     |     |     |
     19    20    21    22
      |     |     |     |
     12-13-14-15-16-17-18
      |     |     |     |
      8     9    10    11
      |     |     |     |
      1--2--3--4--5--6--7

    For this example, the total number of nodes is, as expected,

      N = 3 * 3 * 2 + 2 * 2 + 2 * 3 + 1 = 29

    The matrix is symmetric positive definite for any positive values of the
    density RHO(X,Y).

  Licensing:

    This code is distributed under the GNU LGPL license.

  Modified:

    02 July 2014

  Author:

    John Burkardt.

  Reference:

    Nicholas Higham,
    Algorithm 694: A Collection of Test Matrices in MATLAB,
    ACM Transactions on Mathematical Software,
    Volume 17, Number 3, September 1991, pages 289-305.

    Andrew Wathen,
    Realistic eigenvalue bounds for the Galerkin mass matrix,
    IMA Journal of Numerical Analysis,
    Volume 7, Number 4, October 1987, pages 449-457.

  Parameters:

    Input, int NX, NY, values which determine the size of 
    the matrix.

    Input, int NZ_NUM, the number of values used to 
    describe the matrix.

    Input/output, int *SEED, the random number seed.

    Output, int ROW[NZ_NUM], COL[NZ_NUM], the row and 
    column indices of the nonzero entries.

    Output, double WATHEN_ST[NZ_NUM], the nonzero entries of the matrix.
*/
{
  double *a;
  const double em[8*8] = {
     6.0, -6.0,  2.0, -8.0,  3.0, -8.0,  2.0, -6.0, 
    -6.0, 32.0, -6.0, 20.0, -8.0, 16.0, -8.0, 20.0, 
     2.0, -6.0,  6.0, -6.0,  2.0, -8.0,  3.0, -8.0, 
    -8.0, 20.0, -6.0, 32.0, -6.0, 20.0, -8.0, 16.0, 
     3.0, -8.0,  2.0, -6.0,  6.0, -6.0,  2.0, -8.0, 
    -8.0, 16.0, -8.0, 20.0, -6.0, 32.0, -6.0, 20.0, 
     2.0, -8.0,  3.0, -8.0,  2.0, -6.0,  6.0, -6.0, 
    -6.0, 20.0, -8.0, 16.0, -8.0, 20.0, -6.0, 32.0 };
  int i;
  int j;
  int k;
  int kcol;
  int krow;
  int node[8];
  double rho;

  a = ( double * ) malloc ( nz_num * sizeof ( double ) );
 
  for ( k = 0; k < nz_num; k++ )
  {
    row[k] = 0;
    col[k] = 0;
    a[k] = 0.0;
  }

  k = 0;

  for ( j = 0; j < nx; j++ )
  {
    for ( i = 0; i < nx; i++ )
    {
      node[0] = 3 * ( j + 1 ) * nx + 2 * ( j + 1 ) + 2 * ( i + 1 );
      node[1] = node[0] - 1;
      node[2] = node[0] - 2;
      node[3] = ( 3 * ( j + 1 ) - 1 ) * nx + 2 * ( j + 1 ) + ( i + 1 ) - 2;
      node[4] = ( 3 * ( j + 1 ) - 3 ) * nx + 2 * ( j + 1 ) + 2 * ( i + 1 ) - 4;
      node[5] = node[4] + 1;
      node[6] = node[4] + 2;
      node[7] = node[3] + 1;

      rho = 100.0 * r8_uniform_01 ( seed );

      for ( krow = 0; krow < 8; krow++ )
      {
        for ( kcol = 0; kcol < 8; kcol++ )
        {
          row[k] = node[krow];
          col[k] = node[kcol];
          a[k] = rho * em[krow+kcol*8];
          k = k + 1;
        }
      }
    }
  }

  return a;
}
Example #12
0
double r8_normal_01 ( int *seed )

/******************************************************************************/
/*
  Purpose:

    R8_NORMAL_01 samples the standard normal probability distribution.

  Discussion:

    The standard normal probability distribution function (PDF) has
    mean 0 and standard deviation 1.

    The Box-Muller method is used, which is efficient, but
    generates two values at a time.

  Licensing:

    This code is distributed under the GNU LGPL license.

  Modified:

    01 July 2008

  Author:

    John Burkardt

  Parameters:

    Input/output, int *SEED, a seed for the random number generator.

    Output, double R8_NORMAL_01, a normally distributed random value.
*/
{
  double pi = 3.141592653589793;
  double r1;
  double r2;
  static int used = -1;
  double x;
  static double y = 0.0;

  if ( used == -1 )
  {
    used = 0;
  }
/*
  If we've used an even number of values so far, generate two more, return one,
  and save one.
*/
  if ( ( used % 2 )== 0 )
  {
    for ( ; ; )
    {
      r1 = r8_uniform_01 ( seed );
      if ( r1 != 0.0 )
      {
        break;
      }
    }

    r2 = r8_uniform_01 ( seed );

    x = sqrt ( -2.0 * log ( r1 ) ) * cos ( 2.0 * pi * r2 );
    y = sqrt ( -2.0 * log ( r1 ) ) * sin ( 2.0 * pi * r2 );
  }
  else
  {

    x = y;

  }

  used = used + 1;

  return x;
}
double *disk01_sample ( int n, int *seed )

/******************************************************************************/
/*
  Purpose:

    DISK01_SAMPLE uniformly samples the unit disk in 2D.

  Licensing:

    This code is distributed under the GNU LGPL license. 

  Modified:

    03 January 2014

  Author:

    John Burkardt

  Parameters:

    Input, int N, the number of points.

    Input/output, int *SEED, a seed for the random 
    number generator.

    Output, double X[2*N], the points.
*/
{
  int i;
  int j;
  double norm;
  double r;
  double *v;
  double *x;

  x = ( double * ) malloc ( 2 * n * sizeof ( double ) );

  for ( j = 0; j < n; j++ )
  {
    v = r8vec_normal_01_new ( 2, seed );
/*
  Compute the length of the vector.
*/
    norm = sqrt ( pow ( v[0], 2 ) + pow ( v[1], 2 ) );
/*
  Normalize the vector.
*/
    for ( i = 0; i < 2; i++ )
    {
      v[i] = v[i] / norm;
    }
/*
  Now compute a value to map the point ON the circle INTO the circle.
*/
    r = r8_uniform_01 ( seed );

    for ( i = 0; i < 2; i++ )
    {
      x[i+j*2] = sqrt ( r ) * v[i];
    }
    free ( v );
  }
  return x;
}