summaryrefslogtreecommitdiff
path: root/src/physics.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/physics.c')
-rw-r--r--src/physics.c110
1 files changed, 75 insertions, 35 deletions
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;
@@ -152,21 +138,53 @@ 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;
}
}