From 5659a1baba94d10f76e72c8bbb9fa7576ab4f19b Mon Sep 17 00:00:00 2001 From: Paweł Redman Date: Wed, 6 Apr 2016 00:26:28 +0200 Subject: Proper console, run-time sim editing. --- src/physics.c | 110 +++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 75 insertions(+), 35 deletions(-) (limited to 'src/physics.c') diff --git a/src/physics.c b/src/physics.c index 0925664..fedc4c4 100644 --- a/src/physics.c +++ b/src/physics.c @@ -2,20 +2,6 @@ #include "itc.h" #include "physics.h" -void phy_sim_destroy(phy_sim *sim) -{ - size_t i; - - SDL_DestroyMutex(sim->rotate_lock); - - itc_chan_destroy(&sim->ctl); - - for (i = 0; i < 3; i++) { - free(sim->fields[i].E); - free(sim->fields[i].H); - } -} - static void phy_calc_fc(float *fc, size_t *x, size_t *widths, size_t *dims, float dt, float offset) { @@ -74,7 +60,7 @@ static float remap(float x, float a0, float b0, float a1, float b1) return (x - a0) * (b1 - a1) / (b0 - a0) + a1; } -void phy_sim_reset_aux(phy_sim *sim) +static void phy_sim_zero_aux(phy_sim *sim) { size_t x[3]; phy_field_info *fi = &sim->field_info; @@ -131,7 +117,7 @@ void phy_sim_reset_aux(phy_sim *sim) } } -void phy_sim_reset(phy_sim *sim) +static void phy_sim_zero(phy_sim *sim) { size_t i; phy_field_info *fi; @@ -143,7 +129,7 @@ void phy_sim_reset(phy_sim *sim) memset(sim->fields[i].H, 0, fi->size * sizeof(float)); } - phy_sim_reset_aux(sim); + phy_sim_zero_aux(sim); sim->time = 0; sim->running = false; @@ -151,22 +137,54 @@ void phy_sim_reset(phy_sim *sim) } int phy_sim_create(phy_sim *sim) +{ + memset(sim, 0, sizeof(phy_sim)); + + sim->rotate_lock = SDL_CreateMutex(); + assert(sim->rotate_lock); + itc_chan_create(&sim->ctl); + + con_var_set("width", "50"); + con_var_set("height", "50"); + con_var_set("depth", "50"); + con_var_set("scale", "7e+9"); + con_var_set("time_delta", "0.1"); + + phy_sim_create_fields(sim); + + return 0; +} + +void phy_sim_destroy(phy_sim *sim) { size_t i; - phy_field_info *fi; - memset(sim, 0, sizeof(phy_sim)); + SDL_DestroyMutex(sim->rotate_lock); + + itc_chan_destroy(&sim->ctl); + + for (i = 0; i < 3; i++) { + free(sim->fields[i].E); + free(sim->fields[i].H); + } +} + +int phy_sim_create_fields(phy_sim *sim) +{ + size_t i; + phy_field_info *fi; fi = &sim->field_info; - fi->dims[0] = 50; - fi->dims[1] = 50; - fi->dims[2] = 50; - fi->spacing = 7e+9f / min3(fi->dims[0], fi->dims[1], fi->dims[2]); - sim->time_delta = 0.10f; + fi->dims[0] = con_var_get_size("width"); + fi->dims[1] = con_var_get_size("height"); + fi->dims[2] = con_var_get_size("depth"); + fi->spacing = con_var_get_float("scale") / + min3(fi->dims[0], fi->dims[1], fi->dims[2]); + sim->time_delta = con_var_get_float("time_delta"); - printf("phy_sim_create: Courant number is %f\n", - 3 * LIGHT_SPEED * sim->time_delta / fi->spacing); + con_var_set("courant", va("%f", 3 * LIGHT_SPEED * sim->time_delta / + fi->spacing)); #if 0 sim->pml_widths[0] = 0; @@ -199,31 +217,46 @@ int phy_sim_create(phy_sim *sim) sim->fields[i].E = malloc(fi->size * sizeof(float)); sim->fields[i].H = malloc(fi->size * sizeof(float)); if (!sim->fields[i].E || !sim->fields[i].H) { - con_printf("phy_sim_create: out of memory\n"); + con_printf("phy_sim_create_fields: out of memory\n"); goto error; } } sim->aux = malloc(fi->size1 * sizeof(phy_field_aux_point)); if (!sim->aux) { - con_printf("phy_sim_create: out of memory\n"); + con_printf("phy_sim_create_fields: out of memory\n"); goto error; } - phy_sim_reset(sim); + phy_sim_zero(sim); - itc_chan_create(&sim->ctl); sim->running = false; + sim->valid = true; - sim->rotate_lock = SDL_CreateMutex(); - assert(sim->rotate_lock); return 0; error: - phy_sim_destroy(sim); + phy_sim_destroy_fields(sim); return 1; } +void phy_sim_destroy_fields(phy_sim *sim) +{ + size_t i; + + for (i = 0; i < 3; i++) { + free(sim->fields[i].E); + sim->fields[i].E = NULL; + free(sim->fields[i].H); + sim->fields[i].H = NULL; + } + + free(sim->aux); + sim->aux = NULL; + + sim->valid = false; +} + static float gauss(phy_source_xyplane *s, float t) { return sin(t); //exp(-s->lambda * sq(t - s->time)); @@ -494,14 +527,21 @@ void phy_run_command(phy_sim *sim, int number, void *data) phy_sim_step(sim); break; - case PHY_CMD_RESET: - phy_sim_reset(sim); + case PHY_CMD_ZERO: + phy_sim_zero(sim); break; case PHY_CMD_DEBUG: phy_sim_debug(sim, data); free(data); break; + + case PHY_CMD_RESET: + SDL_LockMutex(sim->rotate_lock); + phy_sim_destroy_fields(sim); + phy_sim_create_fields(sim); + SDL_UnlockMutex(sim->rotate_lock); + break; } } -- cgit