Skip to content

Commit

Permalink
Provides unit structure definitions and supports XML content parsing…
Browse files Browse the repository at this point in the history
… for these units. (#156)

Co-authored-by: Wenweil1 <[email protected]>
  • Loading branch information
WeilongWen and WeilongWen authored Feb 6, 2025
1 parent 2aea2f5 commit 2319123
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 0 deletions.
2 changes: 2 additions & 0 deletions include/fmi4cpp/fmi2/xml/model_description.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include <fmi4cpp/fmi2/xml/fmu_attributes.hpp>
#include <fmi4cpp/fmi2/xml/model_structure.hpp>
#include <fmi4cpp/fmi2/xml/model_variables.hpp>
#include <fmi4cpp/fmi2/xml/unit_definitions.hpp>

#include <memory>
#include <optional>
Expand Down Expand Up @@ -33,6 +34,7 @@ struct model_description_base
std::shared_ptr<const fmi2::model_structure> model_structure;

std::optional<fmi2::default_experiment> default_experiment;
std::optional<fmi2::unit_definitions> unit_definitions;

size_t number_of_event_indicators;
[[nodiscard]] size_t number_of_continuous_states() const;
Expand Down
54 changes: 54 additions & 0 deletions include/fmi4cpp/fmi2/xml/unit_definitions.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*
* File Name: unit_definitions.h
* Description: Defines structures for handling physical units and their conversions, including base units, display units, and unit definitions.
* Author: weilong.wen
* Email: [email protected]
* Created: 2025-02-03
*/

#ifndef FMI4CPP_UNITDEFINITIONS_HPP
#define FMI4CPP_UNITDEFINITIONS_HPP

#include <optional>
#include <string>
#include <vector>

namespace fmi4cpp::fmi2
{

struct base_unit
{
std::optional<int> kg = 0;
std::optional<int> m = 0;
std::optional<int> s = 0;
std::optional<int> A = 0;
std::optional<int> K = 0;
std::optional<int> mol = 0;
std::optional<int> cd = 0;
std::optional<int> rad = 0;
std::optional<double> factor = 1.0;
std::optional<double> offset = 0.0;
};

struct display_unit
{
std::string name;
double factor = 1.0;
double offset = 0.0;
};

struct unit
{
std::string name;
base_unit base_unit;

Check failure on line 43 in include/fmi4cpp/fmi2/xml/unit_definitions.hpp

View workflow job for this annotation

GitHub Actions / vcpkg-on-linux (ubuntu-22.04, 11)

declaration of ‘fmi4cpp::fmi2::base_unit fmi4cpp::fmi2::unit::base_unit’ changes meaning of ‘base_unit’ [-fpermissive]
std::vector<display_unit> display_units;
};

struct unit_definitions
{
std::vector<unit> units;
};

} // namespace fmi4cpp::fmi2

#endif // FMI4CPP_UNITDEFINITIONS_HPP
1 change: 1 addition & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ set(publicHeaders

"fmi4cpp/fmi2/xml/enums.hpp"
"fmi4cpp/fmi2/xml/source_files.hpp"
"fmi4cpp/fmi2/xml/unit_definitions.hpp"

"fmi4cpp/fmi2/xml/default_experiment.hpp"
"fmi4cpp/fmi2/xml/fmu_attributes.hpp"
Expand Down
55 changes: 55 additions & 0 deletions src/fmi4cpp/fmi2/xml/model_description_parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,59 @@ std::unique_ptr<const model_structure> parse_model_structure(const pugi::xml_nod
return std::make_unique<const model_structure>(outputs, derivatives, initial_unknowns);
}

base_unit parse_base_unit(const pugi::xml_node& node)
{
base_unit baseUnit;
baseUnit.kg = parse_attribute<int>(node, "kg");
baseUnit.m = parse_attribute<int>(node, "m");
baseUnit.s = parse_attribute<int>(node, "s");
baseUnit.A = parse_attribute<int>(node, "A");
baseUnit.K = parse_attribute<int>(node, "K");
baseUnit.mol = parse_attribute<int>(node, "mol");
baseUnit.cd = parse_attribute<int>(node, "cd");
baseUnit.rad = parse_attribute<int>(node, "rad");
baseUnit.factor = parse_attribute<double>(node, "factor");
baseUnit.offset = parse_attribute<double>(node, "offset");

return baseUnit;
}

display_unit parse_display_unit(const pugi::xml_node& node)
{
display_unit displayUnit;
displayUnit.name = parse_attribute<std::string>(node, "name");
displayUnit.factor = parse_attribute<double>(node, "factor");
displayUnit.offset = parse_attribute<double>(node, "offset");

return displayUnit;
}

unit parse_unit(const pugi::xml_node& node)
{
unit Unit;
for (const pugi::xml_node& v : node) {
if (std::string("BaseUnit") == v.name()) {
Unit.base_unit = parse_base_unit(v);
} else if (std::string("DisplayUnit") == v.name()) {
Unit.display_units.push_back(parse_display_unit(v));
}
}
Unit.name = parse_attribute<std::string>(node, "name");

return Unit;
}

unit_definitions parse_unit_definitions(const pugi::xml_node& node)
{
unit_definitions unitDefs;
for (const pugi::xml_node& v : node) {
if (std::string("Unit") == v.name()) {
unitDefs.units.push_back(parse_unit(v));
}
}
return unitDefs;
}

fmu_attributes parse_fmu_attributes(const pugi::xml_node& node)
{

Expand Down Expand Up @@ -322,6 +375,8 @@ std::unique_ptr<const model_description> fmi4cpp::fmi2::parse_model_description(
base.model_variables = std::move(parse_model_variables(v));
} else if (std::string("ModelStructure") == v.name()) {
base.model_structure = std::move(parse_model_structure(v));
} else if (std::string("UnitDefinitions") == v.name()) {
base.unit_definitions = std::move(parse_unit_definitions(v));
}
}

Expand Down

0 comments on commit 2319123

Please sign in to comment.