aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile4
-rw-r--r--engine.c23
-rw-r--r--engine.h1
-rw-r--r--main.c18
-rw-r--r--test.c5
-rw-r--r--test_engine.c8
-rw-r--r--ui.c28
-rw-r--r--ui.h3
8 files changed, 86 insertions, 4 deletions
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 <math.h>
#include <string.h>
#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);
@@ -342,6 +344,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 <assert.h>
+#include <stdio.h>
+
+#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);
@@ -196,6 +199,12 @@ init_pressure_ratio(UI *ui) {
}
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);
w_init_number(ui->volume_flow_rate[0]);
@@ -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);
}
@@ -390,10 +400,24 @@ compute_pressure_ratio(UI *ui, int idx) {
}
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;