From b488e735da49ecc95e201d0a14751d802711d787 Mon Sep 17 00:00:00 2001 From: Luis Manuel Diaz Angulo Date: Mon, 20 Apr 2026 14:42:42 +0200 Subject: [PATCH 1/3] Sets output file name to include casename --- test/driver/LauncherTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/driver/LauncherTest.cpp b/test/driver/LauncherTest.cpp index c0fee0e..992ec4a 100644 --- a/test/driver/LauncherTest.cpp +++ b/test/driver/LauncherTest.cpp @@ -108,7 +108,7 @@ TEST_F(LauncherTest, nested_shield_resistance_and_transfer_impedance_written_to_ Launcher tulip(tempInputFile, outputFolder); EXPECT_NO_THROW(tulip.run()); - const auto outJson = readJSON(outputFolder + "tulip.out.json"); + const auto outJson = readJSON(outputFolder + caseName + "tulip.out.json"); std::cout << outJson.dump(4) << std::endl; From 43d4030045855239f9d24c0ee84efbc01d500f3c Mon Sep 17 00:00:00 2001 From: Luis Manuel Diaz Angulo Date: Wed, 22 Apr 2026 08:38:34 +0200 Subject: [PATCH 2/3] Puts multipolar expansion directly in material. --- src/driver/Results.cpp | 2 +- test/driver/DriverTest.cpp | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/driver/Results.cpp b/src/driver/Results.cpp index 129b6ab..5ab6249 100644 --- a/src/driver/Results.cpp +++ b/src/driver/Results.cpp @@ -434,7 +434,7 @@ nlohmann::json MultiwireParametersByDomain::toFDTDJSON() const } else if (auto* inCell = dynamic_cast(params.get())) { mat["type"] = "unshieldedMultiwire"; - mat["inCellParameters"]["multipolarExpansion"] = inCell->toJSON(); + mat["multipolarExpansion"] = inCell->toJSON(); } materials.push_back(mat); diff --git a/test/driver/DriverTest.cpp b/test/driver/DriverTest.cpp index 6facc6d..613d425 100644 --- a/test/driver/DriverTest.cpp +++ b/test/driver/DriverTest.cpp @@ -1048,11 +1048,10 @@ TEST_F(DriverTest, two_wires_open_fdtd_json) // Should have 1 material of type unshieldedMultiwire. ASSERT_EQ(1, fdtdJSON["materials"].size()); EXPECT_EQ("unshieldedMultiwire", fdtdJSON["materials"][0]["type"]); - ASSERT_TRUE(fdtdJSON["materials"][0].contains("inCellParameters")); ASSERT_TRUE( - fdtdJSON["materials"][0]["inCellParameters"].contains("multipolarExpansion")); + fdtdJSON["materials"][0].contains("multipolarExpansion")); - auto& mp = fdtdJSON["materials"][0]["inCellParameters"]["multipolarExpansion"]; + auto& mp = fdtdJSON["materials"][0]["multipolarExpansion"]; ASSERT_TRUE(mp.contains("innerRegionBox")); ASSERT_TRUE(mp.contains("electric")); ASSERT_TRUE(mp.contains("magnetic")); @@ -1100,8 +1099,8 @@ TEST_F(DriverTest, coax_and_bare_wire_fdtd_json) ASSERT_EQ(1, (*shielded)["capacitancePerMeter"].size()); // Check unshielded multiwire (open domain). - ASSERT_TRUE(unshielded->contains("inCellParameters")); - auto& mp = (*unshielded)["inCellParameters"]["multipolarExpansion"]; + ASSERT_TRUE(unshielded->contains("multipolarExpansion")); + auto& mp = (*unshielded)["multipolarExpansion"]; EXPECT_EQ(2, mp["electric"].size()); EXPECT_EQ(2, mp["magnetic"].size()); From 398feb27beb79de61ebdb25a0f01fab68534b254 Mon Sep 17 00:00:00 2001 From: Luis Manuel Diaz Angulo Date: Wed, 22 Apr 2026 16:34:00 +0200 Subject: [PATCH 3/3] refactor: enhance output file naming and ensure trailing slashes in Launcher --- src/Launcher.cpp | 26 ++++++++++++++++++++++++-- test/driver/LauncherTest.cpp | 15 ++++++++++----- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/Launcher.cpp b/src/Launcher.cpp index 334d02e..8960892 100644 --- a/src/Launcher.cpp +++ b/src/Launcher.cpp @@ -29,6 +29,26 @@ bool isAdaptedJson(const std::string& filename) return hasSuffix(filename, ".tulip.adapted.json"); } +std::string ensureTrailingSlash(const std::string& folder) +{ + if (folder.empty() || folder.back() == '/') { + return folder; + } + return folder + "/"; +} + +std::string extractCaseName(const std::string& inputFile) +{ + const auto filename = std::filesystem::path(inputFile).filename().string(); + if (hasSuffix(filename, ".tulip.input.json")) { + return filename.substr(0, filename.size() - std::string(".tulip.input.json").size()); + } + if (hasSuffix(filename, ".tulip.adapted.json")) { + return filename.substr(0, filename.size() - std::string(".tulip.adapted.json").size()); + } + return std::filesystem::path(filename).stem().string(); +} + } // namespace Launcher::Launcher(const std::string& inputFile, const std::string& exportFolder) @@ -43,10 +63,12 @@ Launcher::Launcher(const std::string& inputFile, const std::string& exportFolder void Launcher::run() { std::cout << "Loading input file: " << inputFile_ << std::endl; + const std::string outputPrefix = extractCaseName(inputFile_) + "."; + const std::string driverExportFolder = ensureTrailingSlash(exportFolder_) + outputPrefix; if (isAdaptedJson(inputFile_)) { auto driver = Driver::loadFromAdaptedFile(inputFile_); - driver.setExportFolder(exportFolder_); + driver.setExportFolder(driverExportFolder); std::cout << "Running Tulip analysis..." << std::endl; driver.run(); } @@ -60,7 +82,7 @@ void Launcher::run() Adapter adapter(inputFile_); AdaptedInputParser parser(inputFile_, adapter.getAdaptedInputJSON()); Driver driver(parser.readModel(), parser.readDriverOptions()); - driver.setExportFolder(exportFolder_); + driver.setExportFolder(driverExportFolder); std::cout << "Running Tulip analysis..." << std::endl; driver.run(); } diff --git a/test/driver/LauncherTest.cpp b/test/driver/LauncherTest.cpp index 992ec4a..877b8d7 100644 --- a/test/driver/LauncherTest.cpp +++ b/test/driver/LauncherTest.cpp @@ -12,10 +12,11 @@ namespace { void expectFDTDOutput( const std::string& outputFolder, + const std::string& caseName, std::size_t expectedMaterials, std::size_t expectedAssociations) { - const auto outputFile = outputFolder + "tulip.out.json"; + const auto outputFile = outputFolder + caseName + ".tulip.out.json"; ASSERT_TRUE(std::filesystem::exists(outputFile)); const auto outJSON = readJSON(outputFile); @@ -33,6 +34,7 @@ class LauncherTest : public ::testing::Test {}; TEST_F(LauncherTest, empty_coax_from_adapted) { // Create Launcher instance with empty_coax adapted JSON file + const std::string caseName = "empty_coax"; const std::string inputFile = inputCase("empty_coax"); const std::string outputFolder = outFolder() + "LauncherTest.empty_coax/"; @@ -41,7 +43,7 @@ TEST_F(LauncherTest, empty_coax_from_adapted) // This should complete without throwing an exception EXPECT_NO_THROW(tulip.run()); - expectFDTDOutput(outputFolder, 1, 1); + expectFDTDOutput(outputFolder, caseName, 1, 1); } TEST_F(LauncherTest, empty_coax_from_input_json) @@ -54,11 +56,12 @@ TEST_F(LauncherTest, empty_coax_from_input_json) Launcher tulip(inputFile, outputFolder); EXPECT_NO_THROW(tulip.run()); - expectFDTDOutput(outputFolder, 1, 1); + expectFDTDOutput(outputFolder, caseName, 1, 1); } TEST_F(LauncherTest, coax_and_bare_wire_from_adapted) { + const std::string caseName = "coax_and_bare_wire"; const std::string inputFile = inputCase("coax_and_bare_wire"); const std::string outputFolder = outFolder() + "LauncherTest.coax_and_bare_wire/"; @@ -66,7 +69,7 @@ TEST_F(LauncherTest, coax_and_bare_wire_from_adapted) Launcher tulip(inputFile, outputFolder); EXPECT_NO_THROW(tulip.run()); - expectFDTDOutput(outputFolder, 2, 2); + expectFDTDOutput(outputFolder, caseName, 2, 2); } TEST_F(LauncherTest, nested_shield_resistance_and_transfer_impedance_written_to_output_json) @@ -104,11 +107,13 @@ TEST_F(LauncherTest, nested_shield_resistance_and_transfer_impedance_written_to_ const std::string outputFolder = outFolder() + "LauncherTest.coax_and_bare_wire_with_shield_transfer/"; + const std::string outputCaseName = + "LauncherTest.coax_and_bare_wire_with_shield_transfer"; Launcher tulip(tempInputFile, outputFolder); EXPECT_NO_THROW(tulip.run()); - const auto outJson = readJSON(outputFolder + caseName + "tulip.out.json"); + const auto outJson = readJSON(outputFolder + outputCaseName + ".tulip.out.json"); std::cout << outJson.dump(4) << std::endl;