- 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.
117 lines
3.8 KiB
C
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;
|
|
}
|