Esempio n. 1
0
void
bfam_log_init(int rank, FILE *stream, int threshold)
{

  bfam_log_rank = rank;
  if(stream == NULL)
  {
    bfam_log_stream = stdout;
  }
  else
  {
    bfam_log_stream = stream;
  }

  if(threshold == BFAM_LL_DEFAULT)
  {
    bfam_log_threshold = BFAM_LL_INFO;
  }
  else
  {
    BFAM_ABORT_IF_NOT(threshold <= BFAM_LL_SILENT &&
                      threshold >= BFAM_LL_ALWAYS,
                      "Invalid logging threshold");
    bfam_log_threshold = threshold;
  }
}
Esempio n. 2
0
void bfam_ts_adams_init(
    bfam_ts_adams_t *ts, bfam_domain_t *dom, bfam_ts_adams_method_t method,
    bfam_domain_match_t subdom_match, const char **subdom_tags,
    bfam_domain_match_t comm_match, const char **comm_tags, MPI_Comm mpicomm,
    int mpitag, void *comm_data,
    void (*aux_rates)(bfam_subdomain_t *thisSubdomain, const char *prefix),
    void (*scale_rates)(bfam_subdomain_t *thisSubdomain,
                        const char *rate_prefix, const bfam_long_real_t a),
    void (*intra_rhs)(bfam_subdomain_t *thisSubdomain, const char *rate_prefix,
                      const char *minus_rate_prefix, const char *field_prefix,
                      const bfam_long_real_t t),
    void (*inter_rhs)(bfam_subdomain_t *thisSubdomain, const char *rate_prefix,
                      const char *minus_rate_prefix, const char *field_prefix,
                      const bfam_long_real_t t),
    void (*add_rates)(bfam_subdomain_t *thisSubdomain,
                      const char *field_prefix_lhs,
                      const char *field_prefix_rhs, const char *rate_prefix,
                      const bfam_long_real_t a),
    const int RK_init)
{
  BFAM_LDEBUG("ADAMS INIT");

  /*
   * set up some preliminaries
   */
  bfam_ts_init(&ts->base, dom);
  bfam_dictionary_init(&ts->elems);
  ts->t = BFAM_LONG_REAL(0.0);
  ts->base.step = &bfam_ts_adams_step;

  /*
   * store the function calls
   */
  ts->scale_rates = scale_rates;
  ts->intra_rhs = intra_rhs;
  ts->inter_rhs = inter_rhs;
  ts->add_rates = add_rates;

  ts->currentStage = 0;
  ts->numSteps = 0;

  ts->lsrk = NULL;

  switch (method)
  {
  default:
    BFAM_WARNING("Invalid Adams scheme, using ADAMS_3");
  case BFAM_TS_ADAMS_3:
    ts->nStages = 3;
    /*
    ts->A = bfam_malloc_aligned(ts->nStages*sizeof(bfam_long_real_t));

    ts->A[0] = BFAM_LONG_REAL(23.0)/
               BFAM_LONG_REAL(12.0);
    ts->A[1] = BFAM_LONG_REAL(-4.0)/
               BFAM_LONG_REAL( 3.0);
    ts->A[2] = BFAM_LONG_REAL( 5.0)/
               BFAM_LONG_REAL(12.0);
    */

    /* if necessary initialize the RK scheme */
    if (RK_init)
    {
      ts->lsrk = bfam_ts_lsrk_new_extended(
          dom, BFAM_TS_LSRK_KC54, subdom_match, subdom_tags, comm_match,
          comm_tags, mpicomm, mpitag, comm_data, aux_rates, scale_rates,
          intra_rhs, inter_rhs, add_rates, 0);
    }

    break;
  case BFAM_TS_ADAMS_1:
    ts->nStages = 1;
    /*
    ts->A = bfam_malloc_aligned(ts->nStages*sizeof(bfam_long_real_t));

    ts->A[0] = BFAM_LONG_REAL(1.0);
    */

    /* if necessary initialize the RK scheme */
    if (RK_init)
    {
      ts->lsrk = bfam_ts_lsrk_new_extended(
          dom, BFAM_TS_LSRK_FE, subdom_match, subdom_tags, comm_match,
          comm_tags, mpicomm, mpitag, comm_data, aux_rates, scale_rates,
          intra_rhs, inter_rhs, add_rates, 0);
    }

    break;
  case BFAM_TS_ADAMS_2:
    ts->nStages = 2;
    /*
    ts->A = bfam_malloc_aligned(ts->nStages*sizeof(bfam_long_real_t));

    ts->A[0] = BFAM_LONG_REAL( 3.0)/
               BFAM_LONG_REAL( 2.0);
    ts->A[1] = BFAM_LONG_REAL(-1.0)/
               BFAM_LONG_REAL( 2.0);
    */

    /* if necessary initialize the RK scheme */
    if (RK_init)
    {
      ts->lsrk = bfam_ts_lsrk_new_extended(
          dom, BFAM_TS_LSRK_HEUN, subdom_match, subdom_tags, comm_match,
          comm_tags, mpicomm, mpitag, comm_data, aux_rates, scale_rates,
          intra_rhs, inter_rhs, add_rates, 0);
    }

    break;
  case BFAM_TS_ADAMS_4:
    ts->nStages = 4;
    /*
    ts->A = bfam_malloc_aligned(ts->nStages*sizeof(bfam_long_real_t));

    ts->A[0] = BFAM_LONG_REAL( 55.0)/
               BFAM_LONG_REAL( 24.0);
    ts->A[1] = BFAM_LONG_REAL(-59.0)/
               BFAM_LONG_REAL( 24.0);
    ts->A[2] = BFAM_LONG_REAL( 37.0)/
               BFAM_LONG_REAL( 24.0);
    ts->A[3] = BFAM_LONG_REAL(  3.0)/
               BFAM_LONG_REAL(  8.0);
    */

    /* if necessary initialize the RK scheme */
    if (RK_init)
    {
      ts->lsrk = bfam_ts_lsrk_new_extended(
          dom, BFAM_TS_LSRK_KC54, subdom_match, subdom_tags, comm_match,
          comm_tags, mpicomm, mpitag, comm_data, aux_rates, scale_rates,
          intra_rhs, inter_rhs, add_rates, 0);
    }

    break;
  }

  /*
   * get the subdomains and create rates we will need
   */
  bfam_subdomain_t *subs[dom->numSubdomains + 1];
  bfam_locidx_t numSubs = 0;
  bfam_domain_get_subdomains(dom, subdom_match, subdom_tags, dom->numSubdomains,
                             subs, &numSubs);
  for (int s = 0; s < numSubs; s++)
  {
    int rval = bfam_dictionary_insert_ptr(&ts->elems, subs[s]->name, subs[s]);
    BFAM_ABORT_IF_NOT(rval != 1, "Issue adding subdomain %s", subs[s]->name);

    for (int n = 0; n < ts->nStages; n++)
    {
      char aux_rates_name[BFAM_BUFSIZ];
      snprintf(aux_rates_name, BFAM_BUFSIZ, "%s%d_", BFAM_ADAMS_PREFIX, n);
      aux_rates(subs[s], aux_rates_name);
    }
  }

  /*
   * Set up the communicator we will use
   */
  ts->comm = bfam_communicator_new(dom, comm_match, comm_tags, mpicomm, mpitag,
                                   comm_data);
}
Esempio n. 3
0
int bfam_lua_global_function_call(lua_State *L, const char *name,
                                  const char *sig, ...)
{
  va_list vl;
  int num_arg = 0;
  int num_res = 0;

  va_start(vl, sig);

  char buf[BFAM_LUA_MAX_COMMAND_LEN];
  /* Assign the Lua expression to a Lua global variable. */
  snprintf(buf, BFAM_LUA_MAX_COMMAND_LEN, BFAM_LUA_EVALEXP_VAR "=%s", name);
  if (!luaL_dostring(L, buf))
  {
    /* Get the value of the global varibable */
    lua_getglobal(L, BFAM_LUA_EVALEXP_VAR);
  }
  else
  {
    BFAM_ROOT_WARNING("function `%s' not found in lua file", name);
    return 1;
  }

  if (!lua_isfunction(L, -1))
  {
    BFAM_ROOT_WARNING("function `%s' not found in lua file", name);
    lua_pop(L, 1);
    return 1;
  }

  for (num_arg = 0; sig[num_arg] && sig[num_arg] != '>'; num_arg++)
  {
    luaL_checkstack(L, 1, "too many arguments");

    switch (sig[num_arg])
    {
    case 'd':
      lua_pushnumber(L, va_arg(vl, double));
      break;
    case 'l':
      lua_pushnumber(L, (double)va_arg(vl, bfam_long_real_t));
      break;
    case 'r':
      lua_pushnumber(L, (double)va_arg(vl, bfam_real_t));
      break;
    case 'i':
      lua_pushinteger(L, va_arg(vl, int));
      break;
    case 's':
      lua_pushstring(L, va_arg(vl, char *));
      break;
    case '>':
      break;
    default:
      BFAM_ABORT("function '%s' invalid input argument (%c)", name,
                 sig[num_arg]);
    }
  }

  BFAM_ABORT_IF_NOT(sig[num_arg] == '>', "arguments for '%s' does not contain "
                                         " a '>' character",
                    name);

  num_res = (int)strlen(sig) - num_arg - 1;

  BFAM_ABORT_IF_NOT(lua_pcall(L, num_arg, num_res, 0) == 0,
                    "error running function %s: %s", name, lua_tostring(L, -1));

  for (int n = 0; n < num_res; n++)
  {
    switch (sig[num_arg + 1 + n])
    {
    case 'd':
      BFAM_ABORT_IF_NOT(lua_isnumber(L, n - num_res),
                        "for '%s' return %d expected number got '%s'", name, n,
                        lua_tostring(L, n - num_res));
      *va_arg(vl, double *) = (double)lua_tonumber(L, n - num_res);
      break;
    case 'l':
      BFAM_ABORT_IF_NOT(lua_isnumber(L, n - num_res),
                        "for '%s' return %d expected number got '%s'", name, n,
                        lua_tostring(L, n - num_res));
      *va_arg(vl, bfam_long_real_t *) =
          (bfam_long_real_t)lua_tonumber(L, n - num_res);
      break;
    case 'r':
      BFAM_ABORT_IF_NOT(lua_isnumber(L, n - num_res),
                        "for '%s' return %d expected number got '%s'", name, n,
                        lua_tostring(L, n - num_res));
      *va_arg(vl, bfam_real_t *) = (bfam_real_t)lua_tonumber(L, n - num_res);
      break;
    case 'i':
      BFAM_ABORT_IF_NOT(lua_isnumber(L, n - num_res),
                        "for '%s' return %d expected number got '%s'", name, n,
                        lua_tostring(L, n - num_res));
      *va_arg(vl, int *) = (int)lua_tointeger(L, n - num_res);
      break;
    case 's':
      BFAM_ABORT_IF_NOT(lua_isstring(L, n - num_res),
                        "for '%s' return %d expected string got '%s'", name, n,
                        lua_tostring(L, n - num_res));
      *va_arg(vl, const char **) = lua_tostring(L, n - num_res);
      break;
    default:
      BFAM_ABORT("function '%s' invalid output argument (%c)", name,
                 sig[num_arg]);
    }
  }

  lua_pop(L, num_res);

  va_end(vl);
  return 0;
}