feat(results-and-pipeline): step 3 — cli-pipeline-integration
This commit is contained in:
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user