Entropyk/bindings/c/tests/test_solve.c
Sepehr fa480ed303 feat: implement mass balance validation for Story 7.1
- Added port_mass_flows to Component trait and implements for core components.
- Added System::check_mass_balance and integrated it into the solver.
- Restored connect methods for ExpansionValve, Compressor, and Pipe to fix integration tests.
- Updated Python and C bindings for validation errors.
- Updated sprint status and story documentation.
2026-02-21 23:21:34 +01:00

117 lines
3.8 KiB
C

/**
* Test: End-to-end solve from C
*
* Creates a simple cycle and solves it.
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <assert.h>
#include "entropyk.h"
int main() {
printf("Test: End-to-end solve\n");
/* Create system */
printf(" Creating system... ");
EntropykSystem* sys = entropyk_system_create();
assert(sys != NULL);
printf("OK\n");
/* Create components */
printf(" Creating components... ");
double coeffs[10] = {0.85, 2.5, 500.0, 1500.0, -2.5, 1.8, 600.0, 1600.0, -3.0, 2.0};
EntropykComponent* comp = entropyk_compressor_create(coeffs, 10);
EntropykComponent* cond = entropyk_condenser_create(5000.0);
EntropykComponent* valve = entropyk_expansion_valve_create();
EntropykComponent* evap = entropyk_evaporator_create(3000.0);
assert(comp && cond && valve && evap);
printf("OK\n");
/* Add components (returns node index) */
printf(" Adding components... ");
unsigned int comp_idx = entropyk_system_add_component(sys, comp);
unsigned int cond_idx = entropyk_system_add_component(sys, cond);
unsigned int valve_idx = entropyk_system_add_component(sys, valve);
unsigned int evap_idx = entropyk_system_add_component(sys, evap);
assert(comp_idx != UINT32_MAX);
assert(cond_idx != UINT32_MAX);
assert(valve_idx != UINT32_MAX);
assert(evap_idx != UINT32_MAX);
printf("OK (indices: %u, %u, %u, %u)\n", comp_idx, cond_idx, valve_idx, evap_idx);
/* Verify counts */
printf(" Verifying node count... ");
assert(entropyk_system_node_count(sys) == 4);
printf("OK\n");
/* Add edges */
printf(" Adding edges... ");
EntropykErrorCode err;
err = entropyk_system_add_edge(sys, comp_idx, cond_idx);
assert(err == ENTROPYK_OK);
err = entropyk_system_add_edge(sys, cond_idx, valve_idx);
assert(err == ENTROPYK_OK);
err = entropyk_system_add_edge(sys, valve_idx, evap_idx);
assert(err == ENTROPYK_OK);
err = entropyk_system_add_edge(sys, evap_idx, comp_idx);
assert(err == ENTROPYK_OK);
printf("OK\n");
/* Verify edge count */
printf(" Verifying edge count... ");
assert(entropyk_system_edge_count(sys) == 4);
printf("OK\n");
/* Finalize */
printf(" Finalizing system... ");
err = entropyk_system_finalize(sys);
/* Empty system might fail to finalize - check but don't assert */
if (err != ENTROPYK_OK) {
printf("Note: Finalize returned %d (expected for empty component stubs)\n", err);
} else {
printf("OK\n");
}
/* Configure solver */
printf(" Configuring solver... ");
EntropykFallbackConfig config = {
.newton = {
.max_iterations = 100,
.tolerance = 1e-6,
.line_search = false,
.timeout_ms = 0
},
.picard = {
.max_iterations = 500,
.tolerance = 1e-4,
.relaxation = 0.5
}
};
printf("OK\n");
/* Solve (may not converge with stub components) */
printf(" Attempting solve... ");
EntropykSolverResult* result = NULL;
err = entropyk_solve_fallback(sys, &config, &result);
if (err == ENTROPYK_OK && result != NULL) {
printf("OK\n");
printf("Status: %d\n", entropyk_result_get_status(result));
printf(" Iterations: %u\n", entropyk_result_get_iterations(result));
printf(" Residual: %.2e\n", entropyk_result_get_residual(result));
entropyk_result_free(result);
} else {
printf("Error: %s (expected with stub components)\n", entropyk_error_string(err));
}
/* Cleanup */
printf(" Cleaning up... ");
entropyk_system_free(sys);
printf("OK\n");
printf("End-to-end solve test PASSED\n");
return 0;
}