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; }
/* ---------------------------------------------------------------------- */ 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); }