Exemplo n.º 1
0
static void
p4est_wrap_partition_unchanged (p4est_gloidx_t pre_me,
                                p4est_gloidx_t pre_next,
                                p4est_gloidx_t post_me,
                                p4est_gloidx_t post_next,
                                p4est_locidx_t * unchanged_first,
                                p4est_locidx_t * unchanged_length,
                                p4est_locidx_t * unchanged_old_first)
{
  p4est_locidx_t      uf, ul, uof;
  p4est_gloidx_t      unext;

  /* consistency checks */
  P4EST_ASSERT (0 <= pre_me && pre_me <= pre_next);
  P4EST_ASSERT (0 <= post_me && post_me <= post_next);

  /* initialize the case that no quadrants stay on this processor */
  uf = ul = uof = 0;

  /* check whether any quadrants stay at all, and which ones */
  if (pre_me < post_next && post_me < pre_next) {
    unext = SC_MIN (pre_next, post_next);
    if (pre_me <= post_me) {
      uof = (p4est_locidx_t) (post_me - pre_me);
      ul = (p4est_locidx_t) (unext - post_me);
    }
    else {
      uf = (p4est_locidx_t) (pre_me - post_me);
      ul = (p4est_locidx_t) (unext - pre_me);
    }
  }

  /* consistency checks */
  P4EST_ASSERT (uf >= 0 && ul >= 0 && uof >= 0);
  P4EST_ASSERT ((p4est_gloidx_t) uf + ul <= post_next - post_me);
  P4EST_ASSERT ((p4est_gloidx_t) uof + ul <= pre_next - pre_me);

  /* assign to output variables */
  if (unchanged_first != NULL) {
    *unchanged_first = uf;
  }
  if (unchanged_length != NULL) {
    *unchanged_length = ul;
  }
  if (unchanged_old_first != NULL) {
    *unchanged_old_first = uof;
  }
}
Exemplo n.º 2
0
int
sc_vtk_write_binary (FILE * vtkfile, char *numeric_data, size_t byte_length)
{
  size_t              chunks, chunksize, remaining, writenow;
  size_t              code_length, base_length;
  uint32_t            int_header;
  char               *base_data;
  base64_encodestate  encode_state;

  /* VTK format used 32bit header info */
  SC_ASSERT (byte_length <= (size_t) UINT32_MAX);

  chunksize = (size_t) 1 << 15; /* 32768 */
  int_header = (uint32_t) byte_length;

  code_length = 2 * chunksize;
  base_data = SC_ALLOC (char, code_length);

  base64_init_encodestate (&encode_state);
  base_length =
    base64_encode_block ((char *) &int_header, sizeof (int_header), base_data,
                         &encode_state);
  base_data[base_length] = '\0';
  (void) fwrite (base_data, 1, base_length, vtkfile);

  chunks = 0;
  remaining = byte_length;
  while (remaining > 0) {
    writenow = SC_MIN (remaining, chunksize);
    base_length = base64_encode_block (numeric_data + chunks * chunksize,
                                       writenow, base_data, &encode_state);
    base_data[base_length] = '\0';
    SC_ASSERT (base_length < code_length);
    (void) fwrite (base_data, 1, base_length, vtkfile);
    remaining -= writenow;
    ++chunks;
  }

  base_length = base64_encode_blockend (base_data, &encode_state);
  (void) fwrite (base_data, 1, base_length, vtkfile);

  SC_FREE (base_data);
  if (ferror (vtkfile)) {
    return -1;
  }
  return 0;
}
Exemplo n.º 3
0
static void        *
sc_realloc_aligned (void *ptr, size_t alignment, size_t size)
{
  /* minimum requirements on alignment */
  SC_ASSERT (sizeof (char **) == sizeof (void *));
  SC_ASSERT (sizeof (char **) >= sizeof (size_t));
  SC_ASSERT (alignment > 0 && alignment % sizeof (void *) == 0);
  SC_ASSERT (alignment == SC_MEMALIGN_BYTES);

#if defined SC_HAVE_ANY_MEMALIGN && \
   (defined SC_HAVE_POSIX_MEMALIGN || defined SC_HAVE_ALIGNED_ALLOC)
  /* the result is no longer aligned */
  return realloc (ptr, size);
#else
  {
#ifdef SC_ENABLE_DEBUG
    const ptrdiff_t     signalign = (const ptrdiff_t) alignment;
#endif
    size_t              old_size, min_size;
    void               *new_ptr;

    /* we excluded these cases earlier */
    SC_ASSERT (ptr != NULL && size > 0);
    SC_ASSERT ((ptrdiff_t) ptr % signalign == 0);

    /* back out the previously allocated size */
    old_size = (size_t) ((char **) ptr)[-2];

    /* create new memory while the old memory is still around */
    new_ptr = sc_malloc_aligned (alignment, size);

    /* copy data */
    min_size = SC_MIN (old_size, size);
    memcpy (new_ptr, ptr, min_size);
#ifdef SC_ENABLE_DEBUG
    memset ((char *) new_ptr + min_size, -3, size - min_size);
#endif

    /* free old memory and return new pointer */
    sc_free_aligned (ptr, alignment);
    return new_ptr;
  }
#endif
}
Exemplo n.º 4
0
static void
check_linear_id (const p4est_quadrant_t * q1, const p4est_quadrant_t * q2)
{
  int                 l;
  int                 comp = p4est_quadrant_compare (q1, q2);
  int                 level = (int) SC_MIN (q1->level, q2->level);
  uint64_t            id1 = p4est_quadrant_linear_id (q1, level);
  uint64_t            id2 = p4est_quadrant_linear_id (q2, level);
  p4est_quadrant_t    quad, par, anc;

  /* test linear id */
  if (p4est_quadrant_is_ancestor (q1, q2)) {
    SC_CHECK_ABORT (id1 == id2 && comp < 0, "Ancestor 1");
  }
  else if (p4est_quadrant_is_ancestor (q2, q1)) {
    SC_CHECK_ABORT (id1 == id2 && comp > 0, "Ancestor 2");
  }
  else {
    SC_CHECK_ABORT ((comp == 0 && id1 == id2) || (comp < 0 && id1 < id2)
                    || (comp > 0 && id1 > id2), "compare");
  }

  /* test ancestor and parent functions */
  par = quad = *q1;
  for (l = quad.level - 1; l >= 0; --l) {
    p4est_quadrant_parent (&par, &par);
    p4est_quadrant_ancestor (&quad, l, &anc);
    SC_CHECK_ABORT (p4est_quadrant_is_equal (&par, &anc), "Ancestor test A");
  }
  par = quad = *q2;
  for (l = quad.level - 1; l >= 0; --l) {
    p4est_quadrant_parent (&par, &par);
    p4est_quadrant_ancestor (&quad, l, &anc);
    SC_CHECK_ABORT (p4est_quadrant_is_equal (&par, &anc), "Ancestor test B");
  }
}
Exemplo n.º 5
0
static int
sc_bspline_find_interval (sc_bspline_t * bs, double t)
{
  int                 i, iguess;
  double              t0, t1;
  const double       *knotse = bs->knots->e[0];

  t0 = knotse[bs->n];
  t1 = knotse[bs->n + bs->l];
  SC_ASSERT (t >= t0 && t <= t1);
  SC_ASSERT (bs->cacheknot >= bs->n && bs->cacheknot < bs->n + bs->l);

  if (t >= t1) {
    iguess = bs->cacheknot = bs->n + bs->l - 1;
  }
  else if (knotse[bs->cacheknot] <= t && t < knotse[bs->cacheknot + 1]) {
    iguess = bs->cacheknot;
  }
  else {
    const int           nshift = 1;
    int                 ileft, iright;
    double              tleft, tright;

    ileft = bs->n;
    iright = bs->n + bs->l - 1;
    iguess = bs->n + (int) floor ((t - t0) / (t1 - t0) * bs->l);
    iguess = SC_MAX (iguess, ileft);
    iguess = SC_MIN (iguess, iright);

    for (i = 0;; ++i) {
      tleft = knotse[iguess];
      tright = knotse[iguess + 1];
      if (t < tleft) {
        iright = iguess - 1;
        if (i < nshift) {
          iguess = iright;
        }
        else {
          iguess = (ileft + iright + 1) / 2;
        }
      }
      else if (t >= tright) {
        ileft = iguess + 1;
        if (i < nshift) {
          iguess = ileft;
        }
        else {
          iguess = (ileft + iright) / 2;
        }
      }
      else {
        if (i > 0) {
          SC_LDEBUGF ("For %g needed %d search steps\n", t, i);
        }
        break;
      }
    }
    bs->cacheknot = iguess;
  }
  SC_ASSERT (iguess >= bs->n && iguess < bs->n + bs->l);
  SC_CHECK_ABORT ((knotse[iguess] <= t && t < knotse[iguess + 1]) ||
                  (t >= t1 && iguess == bs->n + bs->l - 1),
                  "Bug in sc_bspline_find_interval");

  return iguess;
}