Example #1
0
int run_sim(lua_State* L)
{
    int n = lua_gettop(L);
    if (n != 1 || !lua_istable(L, 1))
        luaL_error(L, "Argument must be a table");

    double w = lget_number(L, "w", 2.0);
    double h = lget_number(L, "h", w);
    double cfl = lget_number(L, "cfl", 0.45);
    double ftime = lget_number(L, "ftime", 0.01);
    int nx = lget_int(L, "nx", 200);
    int ny = lget_int(L, "ny", nx);
    int nthreads = lget_int(L, "nthreads", 1);
    int timef = lget_int(L, "timef", 1);
    int frames = lget_int(L, "frames", 50);
    const char* fname = lget_string(L, "out", "sim.out");

    central2d_t* sim = central2d_init(w,h, nx,ny,
                                      3, shallow2d_flux, shallow2d_speed, cfl,timef);
    lua_init_sim(L,sim);

    printf("%g %g %d %d %g %d %g\n", w, h, nx, ny, cfl, frames, ftime);
    FILE* viz = viz_open(fname, sim);
    solution_check(sim);
    viz_frame(viz, sim);
    for (int i = 0; i < frames; ++i) {
#ifdef _OPENMP
        double t0 = omp_get_wtime();
        int nstep = central2d_run(sim, ftime, nthreads, timef);
        double t1 = omp_get_wtime();
        double elapsed = t1-t0;
        printf("Time: %e (%e for %d steps)\n", elapsed, elapsed/nstep, nstep);
#elif defined SYSTIME
        struct timeval t0, t1;
        gettimeofday(&t0, NULL);
        int nstep = central2d_run(sim, ftime,nthreads,timef);
        gettimeofday(&t1, NULL);
        double elapsed = (t1.tv_sec-t0.tv_sec) + (t1.tv_usec-t0.tv_usec)*1e-6;
        printf("Time: %e (%e for %d steps)\n", elapsed, elapsed/nstep, nstep);
#else
        int nstep = central2d_run(sim, ftime,nthreads,timef);
        printf("Took %d steps\n", nstep);
#endif
        solution_check(sim);
        viz_frame(viz, sim);
    }
    central2d_free(sim);
    return 0;
}
Example #2
0
File: step.c Project: AkaBlood/ogs5
/* ---------------------------------------------------------------------- */
int
P_step (LDBLE step_fraction)
/* ---------------------------------------------------------------------- */
{
/*
 *   zero global solution, add solution or mixture, add exchange,
 *   add surface, add gas phase, add solid solutions,
 *   set temperature, and add reaction. 
 *   Ensure all elements
 *   included in any of these are present in small amounts.
 *   Save result as n_user -1.
 */
  LDBLE difftemp;
  int step_number;
  struct pp_assemblage *pp_assemblage_save = NULL;
  struct s_s_assemblage *s_s_assemblage_save = NULL;

  if (svnid == NULL)
    fprintf (stderr, " ");

/*
 *   Zero out global solution data
 */

  xsolution_zero ();
/*
 *   Set reaction to zero
 */
  step_x = 0.0;
  step_number = reaction_step;
/*
 *   Mixing or solution
 */
  if (use.mix_ptr != NULL)
  {
    add_mix (use.mix_ptr);
  }
  else if (use.solution_ptr != NULL)
  {
    add_solution (use.solution_ptr, 1.0, 1.0);
  }
  else
  {
    input_error++;
    error_msg ("Neither mixing nor an initial solution have "
	       "been defined in reaction step.", STOP);
  }
/*
 *   Reaction
 */
  if (use.irrev_ptr != NULL)
  {
    add_reaction (use.irrev_ptr, step_number, step_fraction);
  }
/*
 *   Kinetics
 */
  if (use.kinetics_ptr != NULL)
  {
    add_kinetics (use.kinetics_ptr);
    /*
       master_ptr =master_bsearch("S(6)");
       output_msg(OUTPUT_MESSAGE,"Added kinetics, S(6) %e\n", master_ptr->total);
       master_ptr =master_bsearch("S");
       output_msg(OUTPUT_MESSAGE,"Added kinetics, S %e\n", master_ptr->total);
     */
  }
/*
 *   Exchange
 */
  if (use.exchange_ptr != NULL)
  {
    add_exchange (use.exchange_ptr);
  }
/*
 *   Surface
 */
  if (use.surface_ptr != NULL)
  {
    add_surface (use.surface_ptr);
  }
/*
 *   Gases
 */
  if (use.gas_phase_ptr != NULL)
  {
    add_gas_phase (use.gas_phase_ptr);
  }
/*
 *   Temperature
 */
  if (use.temperature_ptr != NULL)
  {
    add_temperature (use.temperature_ptr, step_number);
  }
  if ((state == TRANSPORT) && (transport_step != 0) &&
      (cell > 0) && (cell != count_cells + 1))
  {
    difftemp = tc_x - cell_data[cell - 1].temp;
    cell_data[cell - 1].temp += difftemp / tempr;
    tc_x = cell_data[cell - 1].temp;
  }
/*
 *   Pure phases and solid solutions are added to avoid
 *   zero or negative concentrations
 */
/*
 *   Pure phases
 */
  if (use.pp_assemblage_ptr != NULL)
  {
    pp_assemblage_save =
      (struct pp_assemblage *) PHRQ_malloc (sizeof (struct pp_assemblage));
    if (pp_assemblage_save == NULL)
      malloc_error ();
    pp_assemblage_copy (use.pp_assemblage_ptr, pp_assemblage_save,
			use.pp_assemblage_ptr->n_user);
    add_pp_assemblage (use.pp_assemblage_ptr);
  }
/*
 *   Solid solutions
 */
  if (use.s_s_assemblage_ptr != NULL)
  {
    s_s_assemblage_save =
      (struct s_s_assemblage *) PHRQ_malloc (sizeof (struct s_s_assemblage));
    if (s_s_assemblage_save == NULL)
      malloc_error ();
    s_s_assemblage_copy (use.s_s_assemblage_ptr, s_s_assemblage_save,
			 use.s_s_assemblage_ptr->n_user);
    add_s_s_assemblage (use.s_s_assemblage_ptr);
  }
/*
 *   Check that elements are available for gas components,
 *   pure phases, and solid solutions
 */
  if (use.gas_phase_ptr != NULL)
  {
    gas_phase_check (use.gas_phase_ptr);
  }
  if (use.pp_assemblage_ptr != NULL)
  {
    pp_assemblage_check (use.pp_assemblage_ptr);
  }
  if (use.s_s_assemblage_ptr != NULL)
  {
    s_s_assemblage_check (use.s_s_assemblage_ptr);
  }
/*
 *   Check that element moles are >= zero
 */
  if (solution_check () == MASS_BALANCE)
  {
    /* reset moles and deltas */
    if (use.pp_assemblage_ptr != NULL)
    {
      pp_assemblage_free (use.pp_assemblage_ptr);
      pp_assemblage_copy (pp_assemblage_save, use.pp_assemblage_ptr,
			  use.pp_assemblage_ptr->n_user);
      pp_assemblage_free (pp_assemblage_save);
      pp_assemblage_save =
	(struct pp_assemblage *) free_check_null (pp_assemblage_save);
    }
    if (use.s_s_assemblage_ptr != NULL)
    {
      s_s_assemblage_free (use.s_s_assemblage_ptr);
      s_s_assemblage_copy (s_s_assemblage_save, use.s_s_assemblage_ptr,
			   use.s_s_assemblage_ptr->n_user);
      s_s_assemblage_free (s_s_assemblage_save);
      s_s_assemblage_save =
	(struct s_s_assemblage *) free_check_null (s_s_assemblage_save);
    }
    return (MASS_BALANCE);
  }
/*
 *   Copy global into solution n_user = -1
 */
  xsolution_save (-1);
  step_save_surf (-1);
  step_save_exch (-1);
/*
 *   Clean up temporary space
 */
  if (pp_assemblage_save != NULL)
  {
    pp_assemblage_free (pp_assemblage_save);
    pp_assemblage_save =
      (struct pp_assemblage *) free_check_null (pp_assemblage_save);
  }
  if (s_s_assemblage_save != NULL)
  {
    s_s_assemblage_free (s_s_assemblage_save);
    s_s_assemblage_save =
      (struct s_s_assemblage *) free_check_null (s_s_assemblage_save);
  }
  return (OK);
}