From f03653774e4529404546f474064c5bf679fa7176 Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Sat, 1 Mar 2025 20:30:23 -0500 Subject: add compressor outlet temperature output --- Makefile | 4 ++-- engine.c | 23 ++++++++++++++++++++++- engine.h | 1 + main.c | 18 ++++++++++++++++++ test.c | 5 +++++ test_engine.c | 8 ++++++++ ui.c | 28 +++++++++++++++++++++++++++- ui.h | 3 +++ 8 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 test_engine.c diff --git a/Makefile b/Makefile index 3aa9131..bfcaef6 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,11 @@ CFLAGS = -std=c99 -Wall -Wextra -pedantic -Wno-deprecated-declarations -D_XOPEN_SOURCE=700L -LDFLAGS = -lSDL2 -lSDL2_ttf +LDFLAGS = -lSDL2 -lSDL2_ttf -lm SRC = main.c microui.c renderer.c widget.c ui.c unit.c engine.c OBJ = ${SRC:.c=.o} HDR = microui.h renderer.h widget.h ui.h unit.h engine.h -TEST_SRC = test.c test_angular_speed.c test_pressure.c test_temperature.c test_volume.c test_volume_flow_rate.c test_fraction.c unit.c +TEST_SRC = test.c test_angular_speed.c test_pressure.c test_temperature.c test_volume.c test_volume_flow_rate.c test_fraction.c test_engine.c unit.c engine.c TEST_OBJ = ${TEST_SRC:.c=.o} volute: ${OBJ} diff --git a/engine.c b/engine.c index 5c1568d..b4db059 100644 --- a/engine.c +++ b/engine.c @@ -1,3 +1,4 @@ +#include #include #include "unit.h" @@ -5,7 +6,16 @@ /* A four-stroke piston engine takes two revolutions per cycle. */ -#define REV_PER_CYCLE 2.0 +static const double REV_PER_CYCLE = 2.0; + +/* Specific heat of dry air at constant pressure at T=300K [J/(kg*K)]. */ +static const double C_P_AIR = 1005.0; + +/* Specific heat of dry air at constant volume at T=300K [J/(kg*K)]. */ +static const double C_V_AIR = 718.0; + +/* Heat capacity ratio of dry air at T=300K [J/(kg*K)]. */ +static const double GAMMA_AIR = C_P_AIR / C_V_AIR; void @@ -28,6 +38,17 @@ comp_outlet_pressure(const Engine *e) { return e->map + e->intercooler_deltap; } +Temperature +comp_outlet_temperature(const Engine *e) { + Temperature t1; + Pressure p1, p2; + + t1 = e->ambient_temperature; + p1 = e->ambient_pressure; + p2 = comp_outlet_pressure(e); + return t1 * pow(p2/p1, (GAMMA_AIR-1.0)/GAMMA_AIR); +} + VolumeFlowRate volume_flow_rate(const Engine *e) { double n = as_rpm(e->rpm); diff --git a/engine.h b/engine.h index 7e1eb1e..4e5c5af 100644 --- a/engine.h +++ b/engine.h @@ -12,5 +12,6 @@ typedef struct { void init_engine(Engine *e); Pressure comp_outlet_pressure(const Engine *e); +Temperature comp_outlet_temperature(const Engine *e); double pressure_ratio(const Engine *e); VolumeFlowRate volume_flow_rate(const Engine *e); diff --git a/main.c b/main.c index 4faa1de..e639388 100644 --- a/main.c +++ b/main.c @@ -67,6 +67,7 @@ static void intercooler_efficiency_row(mu_Context *ctx, UI *ui); static void intercooler_deltap_row(mu_Context *ctx, UI *ui); static void dup_del_row(mu_Context *ctx, UI *ui); static void pressure_ratio_row(mu_Context *ctx, UI *ui); +static void comp_outlet_temperature_row(mu_Context *ctx, UI *ui); static void volume_flow_rate_row(mu_Context *ctx, UI *ui); static void hpad(mu_Context *ctx, int w); static void vpad(mu_Context *ctx, int h); @@ -151,6 +152,7 @@ main_window(mu_Context *ctx, UI *ui) { vpad(ctx, 0); pressure_ratio_row(ctx, ui); + comp_outlet_temperature_row(ctx, ui); volume_flow_rate_row(ctx, ui); mu_end_window(ctx); @@ -341,6 +343,22 @@ pressure_ratio_row(mu_Context *ctx, UI *ui) { } } +static void +comp_outlet_temperature_row(mu_Context *ctx, UI *ui) { + int i; + + mu_layout_row(ctx, 0, NULL, 0); + mu_layout_width(ctx, LABEL_WIDTH); + mu_label(ctx, "Compressor T:"); + mu_layout_width(ctx, UNIT_WIDTH); + if (w_select(ctx, &ui->comp_outlet_temperature_unit) & MU_RES_CHANGE) { + compute_all(ui); + } + for (i = 0; i < ui->npoints; i++) { + w_number(ctx, ui->comp_outlet_temperature[i]); + } +} + static void volume_flow_rate_row(mu_Context *ctx, UI *ui) { int i; diff --git a/test.c b/test.c index 48df56e..afaff5d 100644 --- a/test.c +++ b/test.c @@ -47,4 +47,9 @@ main(void) { test_as_cubic_metre_per_sec(); test_as_cubic_metre_per_min(); test_as_cubic_foot_per_min(); + + test_comp_outlet_pressure(); + test_comp_outlet_temperature(); + test_pressure_ratio(); + test_volume_flow_rate(); } diff --git a/test_engine.c b/test_engine.c new file mode 100644 index 0000000..12f0c21 --- /dev/null +++ b/test_engine.c @@ -0,0 +1,8 @@ +#include +#include + +#include "test.h" +#include "unit.h" +#include "engine.h" + +/* TODO */ diff --git a/ui.c b/ui.c index b8d959d..87e118d 100644 --- a/ui.c +++ b/ui.c @@ -61,8 +61,10 @@ static void init_comp_efficiency(UI *ui); static void init_intercooler_efficiency(UI *ui); static void init_intercooler_deltap(UI *ui); static void init_pressure_ratio(UI *ui); +static void init_comp_outlet_temperature(UI *ui); static void init_volume_flow_rate(UI *ui); static void compute_pressure_ratio(UI *ui, int idx); +static void compute_comp_outlet_temperature(UI *ui, int idx); static void compute_volume_flow_rate(UI *ui, int idx); @@ -83,6 +85,7 @@ init_ui(UI *ui) { init_intercooler_deltap(ui); init_pressure_ratio(ui); + init_comp_outlet_temperature(ui); init_volume_flow_rate(ui); compute(ui, 0); @@ -195,6 +198,12 @@ init_pressure_ratio(UI *ui) { w_init_number(ui->pressure_ratio[0]); } +static void +init_comp_outlet_temperature(UI *ui) { + w_init_number(ui->comp_outlet_temperature[0]); + w_init_select(&ui->comp_outlet_temperature_unit, nelem(temperature_units), temperature_units); +} + static void init_volume_flow_rate(UI *ui) { w_init_select(&ui->volume_flow_rate_unit, nelem(volume_flow_rate_units), volume_flow_rate_units); @@ -369,6 +378,7 @@ set_intercooler_deltap_unit(UI *ui) { void compute(UI *ui, int idx) { compute_pressure_ratio(ui, idx); + compute_comp_outlet_temperature(ui, idx); compute_volume_flow_rate(ui, idx); } @@ -389,11 +399,25 @@ compute_pressure_ratio(UI *ui, int idx) { w_set_number(ui->pressure_ratio[idx], pr); } +static void +compute_comp_outlet_temperature(UI *ui, int idx) { + int unit_idx; + TemperatureReader convert; + double v; + + unit_idx = ui->comp_outlet_temperature_unit.idx; + assert(unit_idx >= 0 && (long unsigned int) unit_idx < nelem(temperature_units)); + + convert = temperature_readers[unit_idx]; + v = convert(comp_outlet_temperature(&ui->points[idx])); + w_set_number(ui->comp_outlet_temperature[idx], v); +} + static void compute_volume_flow_rate(UI *ui, int idx) { int unit_idx; VolumeFlowRateReader convert; - VolumeFlowRate v; + double v; unit_idx = ui->volume_flow_rate_unit.idx; assert(unit_idx >= 0 && (long unsigned int) unit_idx < nelem(volume_flow_rate_units)); @@ -422,6 +446,7 @@ insert_point(UI *ui, int idx) { memmove(&ui->intercooler_deltap[i], &ui->intercooler_deltap[i-1], sizeof(ui->intercooler_deltap[i-1])); memmove(&ui->pressure_ratio[i], &ui->pressure_ratio[i-1], sizeof(ui->pressure_ratio[i-1])); + memmove(&ui->comp_outlet_temperature[i], &ui->comp_outlet_temperature[i-1], sizeof(ui->comp_outlet_temperature[i-1])); memmove(&ui->volume_flow_rate[i], &ui->volume_flow_rate[i-1], sizeof(ui->volume_flow_rate[i-1])); } ui->npoints++; @@ -444,6 +469,7 @@ remove_point(UI *ui, int idx) { memmove(&ui->intercooler_deltap[idx], &ui->intercooler_deltap[idx+1], sizeof(ui->intercooler_deltap[idx])); memmove(&ui->pressure_ratio[idx], &ui->pressure_ratio[idx+1], sizeof(ui->pressure_ratio[idx])); + memmove(&ui->comp_outlet_temperature[idx], &ui->comp_outlet_temperature[idx+1], sizeof(ui->comp_outlet_temperature[idx])); memmove(&ui->volume_flow_rate[idx], &ui->volume_flow_rate[idx+1], sizeof(ui->volume_flow_rate[idx])); } ui->npoints--; diff --git a/ui.h b/ui.h index c83dff8..d30256c 100644 --- a/ui.h +++ b/ui.h @@ -29,6 +29,9 @@ typedef struct { w_Number pressure_ratio[MAX_POINTS]; + w_Number comp_outlet_temperature[MAX_POINTS]; + w_Select comp_outlet_temperature_unit; + w_Select volume_flow_rate_unit; w_Number volume_flow_rate[MAX_POINTS]; } UI; -- cgit v1.2.3