feat(results-and-pipeline): step 3 — cli-pipeline-integration

This commit is contained in:
KOKO\Mimi
2026-08-01 01:11:01 +09:00
parent 493219d3c2
commit fe90528115
6 changed files with 316 additions and 1 deletions
+37
View File
@@ -0,0 +1,37 @@
#include <fesa/analysis/run_solver.hpp>
#include <optional>
#include <utility>
#include <fesa/io/abaqus/parser.hpp>
#include <fesa/io/abaqus/semantic_mapper.hpp>
#include <fesa/io/hdf5/writer.hpp>
namespace fesa {
AnalysisRunResult run_solver(const AnalysisRequest& request) {
ParseDeckResult parsed = parse_deck(request.input_path);
if (!parsed.deck.has_value()) {
return {false, std::nullopt, std::move(parsed.diagnostics)};
}
DomainBuildResult mapped = map_deck_to_domain(*parsed.deck);
if (!mapped.domain.has_value()) {
return {false, std::nullopt, std::move(mapped.diagnostics)};
}
AnalysisRunResult run = LinearStaticAnalysis{}.run(*mapped.domain);
if (!run.succeeded || !run.results.has_value()) {
return run;
}
std::vector<Diagnostic> write_diagnostics = write_hdf5(
request.output_path, *mapped.domain, *run.results);
if (!write_diagnostics.empty()) {
return {false, std::nullopt, std::move(write_diagnostics)};
}
return run;
}
} // namespace fesa
+62 -1
View File
@@ -1,14 +1,75 @@
#include <fesa/analysis/run_solver.hpp>
#include <fesa/core/version.hpp>
#include <filesystem>
#include <iostream>
#include <string>
#include <string_view>
namespace {
std::string_view stage_name(const fesa::DiagnosticStage stage) {
switch (stage) {
case fesa::DiagnosticStage::io:
return "io";
case fesa::DiagnosticStage::syntax:
return "syntax";
case fesa::DiagnosticStage::semantic:
return "semantic";
case fesa::DiagnosticStage::model:
return "model";
case fesa::DiagnosticStage::equation:
return "equation";
case fesa::DiagnosticStage::solver:
return "solver";
case fesa::DiagnosticStage::results:
return "results";
case fesa::DiagnosticStage::validation:
return "validation";
}
return "unknown";
}
void print_diagnostic(const fesa::Diagnostic& diagnostic) {
std::cerr << stage_name(diagnostic.stage) << " [" << diagnostic.code
<< "]";
if (diagnostic.source.has_value()) {
const fesa::SourceLocation& source = *diagnostic.source;
std::cerr << ' ' << source.file.string() << ':' << source.line << ':'
<< source.column;
}
std::cerr << ": " << diagnostic.message << '\n';
}
void print_usage() {
std::cerr << "Usage:\n"
<< " fesa solve <model.inp> --output <results.h5>\n"
<< " fesa --version\n";
}
} // namespace
int main(int argc, char* argv[]) {
if (argc == 2 && std::string_view{argv[1]} == "--version") {
std::cout << fesa::version() << '\n';
return 0;
}
std::cerr << "Usage: fesa --version\n";
if (argc == 5 && std::string_view{argv[1]} == "solve" &&
std::string_view{argv[3]} == "--output") {
const fesa::AnalysisRunResult result = fesa::run_solver({
std::filesystem::path{argv[2]},
std::filesystem::path{argv[4]},
});
if (result.succeeded) {
return 0;
}
for (const fesa::Diagnostic& diagnostic : result.diagnostics) {
print_diagnostic(diagnostic);
}
return 1;
}
print_usage();
return 1;
}