diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2025-03-01 18:01:28 -0500 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2025-03-01 18:01:28 -0500 |
| commit | 949175f82b16a93fb02d6471a98f8804fca3aeeb (patch) | |
| tree | cd86cd109058216a3e7725b7d9abbd420313de4b | |
| parent | acf6a9282ee46400155549e407e0279c336a0ec8 (diff) | |
| download | volute-949175f82b16a93fb02d6471a98f8804fca3aeeb.zip | |
add intercooler pressure drop input
| -rw-r--r-- | engine.h | 1 | ||||
| -rw-r--r-- | main.c | 22 | ||||
| -rw-r--r-- | ui.c | 57 | ||||
| -rw-r--r-- | ui.h | 10 |
4 files changed, 81 insertions, 9 deletions
@@ -7,6 +7,7 @@ typedef struct { Fraction ve; Fraction comp_efficiency; Fraction intercooler_efficiency; + Pressure intercooler_deltap; } Engine; void init_engine(Engine *e); @@ -64,6 +64,7 @@ static void map_row(mu_Context *ctx, UI *ui); static void ve_row(mu_Context *ctx, UI *ui); static void comp_efficiency_row(mu_Context *ctx, UI *ui); 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 volume_flow_rate_row(mu_Context *ctx, UI *ui); static void hpad(mu_Context *ctx, int w); @@ -143,6 +144,7 @@ main_window(mu_Context *ctx, UI *ui) { ve_row(ctx, ui); comp_efficiency_row(ctx, ui); intercooler_efficiency_row(ctx, ui); + intercooler_deltap_row(ctx, ui); dup_del_row(ctx, ui); vpad(ctx, 0); @@ -284,6 +286,26 @@ intercooler_efficiency_row(mu_Context *ctx, UI *ui) { } static void +intercooler_deltap_row(mu_Context *ctx, UI *ui) { + int i; + + mu_layout_row(ctx, 0, NULL, 0); + mu_layout_width(ctx, LABEL_WIDTH); + mu_label(ctx, "Intercooler ΔP:"); + mu_layout_width(ctx, UNIT_WIDTH); + if (w_select(ctx, &ui->intercooler_deltap_unit) & MU_RES_CHANGE) { + set_intercooler_deltap_unit(ui); + } + mu_layout_width(ctx, FIELD_WIDTH); + for (i = 0; i < ui->npoints; i++) { + if (w_field(ctx, &ui->intercooler_deltap[i])) { + set_intercooler_deltap(ui, i); + set_volume_flow_rate(ui, i); + } + } +} + +static void dup_del_row(mu_Context *ctx, UI *ui) { int i; @@ -43,25 +43,35 @@ static const VolumeFlowRateReader volume_flow_rate_readers[nelem(volume_flow_rat void init_ui(UI *ui) { + ui->npoints = 1; + init_engine(&ui->points[0]); + w_init_field(&ui->displacement); w_init_select(&ui->displacement_unit, nelem(volume_units), volume_units); w_init_field(&ui->ambient_temperature); w_init_select(&ui->ambient_temperature_unit, nelem(temperature_units), temperature_units); - + w_init_field(&ui->ambient_pressure); w_init_select(&ui->ambient_pressure_unit, nelem(pressure_units), pressure_units); - ui->npoints = 1; - w_init_field(&ui->rpm[0]); + w_set_field(&ui->rpm[0], as_rpm(DEFAULT_RPM)); w_init_field(&ui->map[0]); w_init_select(&ui->map_unit, nelem(pressure_units), pressure_units); w_init_field(&ui->ve[0]); + w_set_field(&ui->ve[0], as_percent(DEFAULT_VE)); - init_engine(&ui->points[0]); + w_init_field(&ui->comp_efficiency[0]); + w_set_field(&ui->comp_efficiency[0], as_percent(DEFAULT_COMPRESSOR_EFFICIENCY)); + + w_init_field(&ui->intercooler_efficiency[0]); + w_set_field(&ui->intercooler_efficiency[0], as_percent(DEFAULT_INTERCOOLER_EFFICIENCY)); + + w_init_field(&ui->intercooler_deltap[0]); + w_init_select(&ui->intercooler_deltap_unit, nelem(pressure_units), pressure_units); 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]); @@ -204,6 +214,35 @@ set_intercooler_efficiency(UI *ui, int idx) { } void +set_intercooler_deltap(UI *ui, int idx) { + int unit_idx; + PressureMaker convert; + Pressure p; + + unit_idx = ui->intercooler_deltap_unit.idx; + assert(unit_idx >= 0 && (long unsigned int) unit_idx < nelem(pressure_units)); + + convert = pressure_makers[unit_idx]; + p = convert(ui->intercooler_deltap[idx].value); + ui->points[idx].intercooler_deltap = p; +} + +void +set_intercooler_deltap_unit(UI *ui) { + PressureMaker maker; + PressureReader reader; + int i; + Pressure p; + + maker = pressure_makers[ui->intercooler_deltap_unit.oldidx]; + reader = pressure_readers[ui->intercooler_deltap_unit.idx]; + for (i = 0; i < ui->npoints; i++) { + p = maker(ui->intercooler_deltap[i].value); + w_set_field(&ui->intercooler_deltap[i], reader(p)); + } +} + +void set_volume_flow_rate(UI *ui, int idx) { int unit_idx; VolumeFlowRateReader convert; @@ -235,12 +274,15 @@ insert_point(UI *ui, int idx) { } for (i = ui->npoints; i > idx; i--) { + memmove(&ui->points[i], &ui->points[i-1], sizeof(ui->points[i-1])); + memmove(&ui->rpm[i], &ui->rpm[i-1], sizeof(ui->rpm[i-1])); memmove(&ui->map[i], &ui->map[i-1], sizeof(ui->map[i-1])); memmove(&ui->ve[i], &ui->ve[i-1], sizeof(ui->ve[i-1])); memmove(&ui->comp_efficiency[i], &ui->comp_efficiency[i-1], sizeof(ui->comp_efficiency[i-1])); memmove(&ui->intercooler_efficiency[i], &ui->intercooler_efficiency[i-1], sizeof(ui->intercooler_efficiency[i-1])); - memmove(&ui->points[i], &ui->points[i-1], sizeof(ui->points[i-1])); + memmove(&ui->intercooler_deltap[i], &ui->intercooler_deltap[i-1], sizeof(ui->intercooler_deltap[i-1])); + memmove(&ui->volume_flow_rate[i], &ui->volume_flow_rate[i-1], sizeof(ui->volume_flow_rate[i-1])); } ui->npoints++; @@ -253,12 +295,15 @@ remove_point(UI *ui, int idx) { } for (; idx < ui->npoints-1; idx++) { + memmove(&ui->points[idx], &ui->points[idx+1], sizeof(ui->points[idx])); + memmove(&ui->rpm[idx], &ui->rpm[idx+1], sizeof(ui->rpm[idx])); memmove(&ui->map[idx], &ui->map[idx+1], sizeof(ui->map[idx])); memmove(&ui->ve[idx], &ui->ve[idx+1], sizeof(ui->ve[idx])); memmove(&ui->comp_efficiency[idx], &ui->comp_efficiency[idx+1], sizeof(ui->comp_efficiency[idx])); memmove(&ui->intercooler_efficiency[idx], &ui->intercooler_efficiency[idx+1], sizeof(ui->intercooler_efficiency[idx])); - memmove(&ui->points[idx], &ui->points[idx+1], sizeof(ui->points[idx])); + memmove(&ui->intercooler_deltap[idx], &ui->intercooler_deltap[idx+1], sizeof(ui->intercooler_deltap[idx])); + memmove(&ui->volume_flow_rate[idx], &ui->volume_flow_rate[idx+1], sizeof(ui->volume_flow_rate[idx])); } ui->npoints--; @@ -1,6 +1,9 @@ enum { MAX_POINTS = 16 }; typedef struct { + int npoints; + Engine points[MAX_POINTS]; + w_Field displacement; w_Select displacement_unit; @@ -10,8 +13,6 @@ typedef struct { w_Field ambient_pressure; w_Select ambient_pressure_unit; - int npoints; - w_Field rpm[MAX_POINTS]; w_Field map[MAX_POINTS]; @@ -23,7 +24,8 @@ typedef struct { w_Field intercooler_efficiency[MAX_POINTS]; - Engine points[MAX_POINTS]; + w_Field intercooler_deltap[MAX_POINTS]; + w_Select intercooler_deltap_unit; w_Select volume_flow_rate_unit; w_Number volume_flow_rate[MAX_POINTS]; @@ -42,6 +44,8 @@ void set_map_unit(UI *ui); void set_ve(UI *ui, int idx); void set_comp_efficiency(UI *ui, int idx); void set_intercooler_efficiency(UI *ui, int idx); +void set_intercooler_deltap(UI *ui, int idx); +void set_intercooler_deltap_unit(UI *ui); void set_volume_flow_rate(UI *ui, int idx); void set_all_volume_flow_rate(UI *ui); void insert_point(UI *ui, int idx); |