C++ Library

The lib_poem library is the core of POEM and relies on several dependencies among them NetCDF-4 library.

Basic Usage

Building a POEM File from scratch

Note

This example is correct with respect to lib_poem C++ library usage but does not produce a file that is conform regarding the specifications. See POEM Specifications for more information.

#include <poem/poem.h>

using namespace poem;

// Create the root as a PolarSet
auto vessel = make_polar_set("vessel", "my vessel");

// Create some Dimensions
auto STW = make_dimension("STW", "kt", "Speed Through Water");
auto Power = make_dimension("Power", "kW", "Power");
auto TWS = make_dimension("TWS", "kt", "True Wind Speed");
auto TWA = make_dimension("TWA", "kt", "True Wind Angle");

// Create two DimensionSet (3D)
auto dimension_set_STW_control = make_dimension_set({STW, TWS, TWA});
auto dimension_set_Power_control = make_dimension_set({Power, TWS, TWA});

// Create two DimensionGrid
auto dimension_grid_STW_control = make_dimension_grid(dimension_set_STW_control);
auto dimension_grid_Power_control = make_dimension_grid(dimension_set_Power_control);

// Create sampling for each Dimension
std::vector<double> STW_vector{0., 2., 4., 6., 8., 10., 12., 14.};
std::vector<double> Power_vector{500., 1000., 1500., 2000.};
std::vector<double> TWS_vector{0., 10., 20., 30., 40.};
std::vector<double> TWA_vector{0., 45., 90., 135., 180.};

// Get DimensionGrid the Dimension samplings
dimension_grid_STW_control->set_values("STW", STW_vector);
dimension_grid_STW_control->set_values("TWS", TWS_vector);
dimension_grid_STW_control->set_values("TWA", TWA_vector);

dimension_grid_Power_control->set_values("Power", Power_vector);
dimension_grid_Power_control->set_values("TWS", TWS_vector);
dimension_grid_Power_control->set_values("TWA", TWA_vector);

// At this stage, we got a DimensionGrid ready and cartesian product between Dimension
// of DimensionSet are automatically calculated to produce DimensionPoint list

// Create a HPPP Polar and a HVPP Polar in the PolarSet
polar_HPPP = polar_set->create_polar(HPPP, dimension_grid_STW_control);
polar_HVPP = polar_set->create_polar(HVPP, dimension_grid_Power_control);

// Create some PolarTable into the Polar
polar_HPPP->create_polar_table<double>("Power", "kW", "Power polar");
polar_HPPP->create_polar_table<int>("SomeInt"), "-", "Some Integer variable");
polar_HVPP->create_polar_table<double>("STW", "kt", "Speed Through Water");
polar_HVPP->create_polar_table<int>("SomeInt"), "-", "Some Integer variable");

// Write to a POEM File
to_netcdf(vessel, "my_vessel", "my_vessel.nc");

Loading a POEM File

#include <poem/poem.h>

using namespace poem;

// Load the POEM File
auto root_node = load("my_vessel.nc");

// Print a layout of the file
auto layout = root_node->layout();
std::cout << layout.dump(2) << std::endl;

Building

Building the lib_poem library

To build lib_poem, you need to get the source from repository:

~$ git clone https://github.com/D-ICE/poem.git

From the root of your local git repository:

~$ mkdir build
~$ cd build
~$ cmake .. -DCMAKE_BUILD_TYPE=Release
~$ make _poem

Building and running the tests

From the root of your local git repository:

~$ mkdir build
~$ cd build
~$ cmake .. -DCMAKE_BUILD_TYPE=Release
~$ make poem_tests
~$ cd bin/tests
~$ ./poem_tests

Integration in cpp projects

To include lib_poem in your C++ project, you need to use CMake in your build chain.

The simplest way to include lib_poem is to use the FetContent module of CMake.

In your main CMakeLists.txt file:

include(FetchContent)

FetchContent_Declare(poem
        GIT_REPOSITORY "https://github.com/D-ICE/poem.git"
        GIT_TAG "v1.6.1"  # replace with the tag you need
)

set(POEM_BUILD_TESTS OFF CACHE BOOL "")
set(POEM_BUILD_TOOLS OFF CACHE BOOL "")
set(POEM_ALLOW_DIRTY OFF CACHE BOOL "")
set(POEM_BUILD_PYTHON OFF CACHE BOOL "")
set(POEM_BUILD_POC OFF CACHE BOOL "")
set(POEM_DEPS_GRAPH OFF CACHE BOOL "")

FetchContent_MakeAvailable(poem)

add_library(my_library)
target_sources(my_library PUBLIC ${SOURCES})  # SOURCES variable with your .cpp implementation files
target_link_libraries(my_library _poem)