108 std::vector<std::array<double, 7>>
121 std::vector<BladeInitialState>
125 bool is_hawt, std::span<const float, 3> ref_pos, std::span<const double, 7> hub_pos,
126 std::span<const double, 7> nacelle_pos, std::span<const BladeInitialState> blade_states
140 throw std::runtime_error(
"No blades defined. At least one blade is required.");
145 return blade.node_initial_positions.empty();
147 throw std::runtime_error(
"No nodes defined for a blade. At least one node is required.");
163 std::span<const double, 7> data, std::span<float, 3> position,
164 std::array<std::array<double, 3>, 3>& orientation
167 for (
auto i : std::views::iota(0U, 3U)) {
168 position[i] =
static_cast<float>(data[i]);
172 const auto om = Eigen::Quaternion<double>(data[3], data[4], data[5], data[6]).toRotationMatrix();
173 orientation = std::array{
174 std::array{om(0, 0), om(0, 1), om(0, 2)}, std::array{om(1, 0), om(1, 1), om(1, 2)},
175 std::array{om(2, 0), om(2, 1), om(2, 2)}
190 std::vector<std::array<std::array<double, 3>, 3>>
193 std::vector<std::array<float, 6>>
195 std::vector<std::array<float, 6>>
load;
199 :
n_points(static_cast<int32_t>(n_nodes)),
200 position(n_nodes, std::array{0.F, 0.F, 0.F}),
203 std::array{std::array{0., 0., 0.}, std::array{0., 0., 0.}, std::array{0., 0., 0.}}
205 velocity(n_nodes, std::array{0.F, 0.F, 0.F, 0.F, 0.F, 0.F}),
206 acceleration(n_nodes, std::array{0.F, 0.F, 0.F, 0.F, 0.F, 0.F}),
207 load(n_nodes, std::array{0.F, 0.F, 0.F, 0.F, 0.F, 0.F}) {}
211 size_t n_mesh_pts, std::span<
const std::array<double, 7>> pos,
212 std::span<
const std::array<float, 6>> vel, std::span<
const std::array<float, 6>> acc,
213 std::span<
const std::array<float, 6>> ld
215 :
n_points(static_cast<int32_t>(n_mesh_pts)),
216 position(n_mesh_pts, std::array{0.F, 0.F, 0.F}),
219 std::array{std::array{0., 0., 0.}, std::array{0., 0., 0.}, std::array{0., 0., 0.}}
221 velocity.assign(std::begin(vel), std::end(vel));
223 load.assign(std::begin(ld), std::end(ld));
236 throw std::invalid_argument(
"Number of mesh points must be at least 1");
240 auto check_vector_size = [](
const auto& vec,
size_t exp_size,
const std::string& vec_name) {
241 if (vec.size() != exp_size) {
242 throw std::invalid_argument(vec_name +
" vector size does not match n_mesh_points");
247 check_vector_size(
position, expected_size,
"Position");
248 check_vector_size(
orientation, expected_size,
"Orientation");
249 check_vector_size(
velocity, expected_size,
"Velocity");
250 check_vector_size(
acceleration, expected_size,
"Acceleration");
251 check_vector_size(
load, expected_size,
"Loads");
259 size_t point_number, std::span<const double, 7> pos, std::span<const double, 6> vel,
260 std::span<const double, 6> acc
262 if (std::cmp_greater_equal(point_number,
n_points)) {
263 throw std::out_of_range(
"point number out of range.");
266 pos, this->position[point_number], this->
orientation[point_number]
268 std::ranges::copy(vel, std::begin(
velocity[point_number]));
269 std::ranges::copy(acc, std::begin(
acceleration[point_number]));
324 InitializeHubAndNacelle(tc);
327 InitializeBlades(tc);
336 throw std::runtime_error(
"Invalid number of blades. Must be at least 1.");
341 throw std::runtime_error(
"Hub and nacelle should have exactly one mesh point each.");
346 throw std::runtime_error(
"Number of blade roots does not match number of blades.");
351 throw std::runtime_error(
"Blade node to blade number mapping size mismatch.");
356 throw std::runtime_error(
"Node indices by blade size mismatch.");
361 const auto total_nodes = std::transform_reduce(
363 [](
const auto& blade) {
368 throw std::runtime_error(
"Total number of blade nodes mismatch.");
390 size_t blade_number,
size_t node_number,
const std::array<double, 7>& position,
391 const std::array<double, 6>& velocity,
const std::array<double, 6>& acceleration
396 throw std::out_of_range(
"Blade or node number out of range.");
400 const auto r_x2z = Eigen::Quaternion<double>(
401 Eigen::AngleAxis<double>(std::numbers::pi / 2., Eigen::Matrix<double, 3, 1>::Unit(1))
405 const auto r = Eigen::Quaternion<double>(position[3], position[4], position[5], position[6]);
408 const auto r_adi = r * r_x2z;
411 const std::array<double, 7> position_new{position[0], position[1], position[2], r_adi.w(),
412 r_adi.x(), r_adi.y(), r_adi.z()};
431 size_t blade_number,
const std::array<double, 7>& position,
432 const std::array<double, 6>& velocity,
const std::array<double, 6>& acceleration
434 if (std::cmp_greater_equal(blade_number,
n_blades)) {
435 throw std::out_of_range(
"Blade number out of range.");
439 const auto r_x2z = Eigen::Quaternion<double>(
440 Eigen::AngleAxis<double>(std::numbers::pi / 2., Eigen::Matrix<double, 3, 1>::Unit(1))
444 const auto r = Eigen::Quaternion<double>(position[3], position[4], position[5], position[6]);
447 const auto r_adi = r * r_x2z;
450 const auto position_new = std::array{position[0], position[1], position[2], r_adi.w(),
451 r_adi.x(), r_adi.y(), r_adi.z()};
467 const std::array<double, 7>& position,
const std::array<double, 6>& velocity,
468 const std::array<double, 6>& acceleration
470 this->hub.
SetValues(0, position, velocity, acceleration);
484 const std::array<double, 7>& position,
const std::array<double, 6>& velocity,
485 const std::array<double, 6>& acceleration
487 this->nacelle.
SetValues(0, position, velocity, acceleration);
499 [[nodiscard]] std::array<double, 6>
GetBladeNodeLoad(
size_t blade_number,
size_t node_number)
501 if (std::cmp_greater_equal(blade_number,
n_blades) ||
503 throw std::out_of_range(
"Blade or node number out of range.");
510 return std::array<double, 6>{
511 static_cast<double>(loads[0]),
static_cast<double>(loads[1]),
512 static_cast<double>(loads[2]),
static_cast<double>(loads[3]),
513 static_cast<double>(loads[4]),
static_cast<double>(loads[5]),
519 static size_t CalculateTotalBladeNodes(
const TurbineConfig& tc) {
520 return std::accumulate(
522 [](
size_t sum,
const auto& blade) {
523 return sum + blade.node_initial_positions.size();
529 void InitializeHubAndNacelle(
const TurbineConfig& tc) {
537 void InitializeBlades(
const TurbineConfig& tc) {
539 size_t i_node_total{0};
542 for (
const auto& blade : tc.blade_initial_states) {
545 i_blade,
blade.root_initial_position, std::array<double, 6>{0., 0., 0., 0., 0., 0.},
546 std::array<double, 6>{0., 0., 0., 0., 0., 0.}
551 for (
const auto& position :
blade.node_initial_positions) {
556 i_blade, i_node, position,
557 std::array<double, 6>{0., 0., 0., 0., 0., 0.},
558 std::array<double, 6>{0., 0., 0., 0., 0., 0.}
645 -2.5F, -2.5F, 0.F, 10.F, 5.F, 5.F
682 const std::string& shared_lib_path =
"aerodyn_inflow_c_binding.dll",
684 EnvironmentalConditions ec = EnvironmentalConditions{},
685 SimulationControls sc = SimulationControls{}, VTKSettings vtk = VTKSettings{}
687 : lib_{shared_lib_path, util::dylib::no_filename_decorations},
691 sim_controls_{std::move(sc)},
692 vtk_settings_{std::move(vtk)} {}
697 return env_conditions_;
714 void Initialize(std::span<const TurbineConfig> turbine_configs) {
718 is_initialized_ =
true;
728 lib_.
get_function<void(
int*,
int*,
int*,
int*,
int*,
char*)>(
"ADI_C_PreInit");
731 auto debug_level_int =
static_cast<int32_t
>(sim_controls_.
debug_level);
732 auto transpose_dcm_int = sim_controls_.
transpose_DCM ? 1 : 0;
733 auto n_turbines_int =
static_cast<int32_t
>(n_turbines);
739 &point_load_output_int,
753 void SetupRotors(std::span<const TurbineConfig> turbine_configs) {
755 void(
int*,
int*,
const float*,
float*,
double*,
float*,
double*,
int*,
float*,
double*,
int*,
float*,
double*,
int*,
int*,
char*)>(
760 int32_t turbine_number{0};
761 for (
const auto& tc : turbine_configs) {
766 int32_t is_horizontal_axis_int = tc.is_horizontal_axis ? 1 : 0;
780 &is_horizontal_axis_int,
781 tc.reference_position.data(),
782 td.hub.position[0].data(),
783 td.hub.orientation[0][0].data(),
784 td.nacelle.position[0].data(),
785 td.nacelle.orientation[0][0].data(),
787 td.blade_roots.position[0].data(),
788 td.blade_roots.orientation[0].data()->data(
790 &td.blade_nodes.n_points,
791 td.blade_nodes.position[0].data(),
792 td.blade_nodes.orientation[0][0].data(),
793 td.blade_nodes_to_blade_num_mapping.data(
808 void(
int*,
char**,
int*,
int*,
char**,
int*,
const char*,
const char*,
float*,
float*,
float*,
float*,
float*,
float*,
float*,
float*,
int*,
double*,
double*,
int*,
int*,
int*,
double*,
float*,
float*,
int*,
double*,
int*,
char*,
char*,
int*,
char*)>(
813 int32_t is_aerodyn_input_passed_as_string = 0;
814 int32_t is_inflowwind_input_passed_as_string = 0;
815 int32_t store_HH_wind_speed_int = 1;
818 char* aerodyn_input_pointer{sim_controls_.
aerodyn_input.data()};
819 auto aerodyn_input_length =
static_cast<int32_t
>(sim_controls_.
aerodyn_input.size());
822 auto inflowwind_input_length =
static_cast<int32_t
>(sim_controls_.
inflowwind_input.size());
825 std::string channel_names_c((20 * 8000) + 1,
' ');
826 std::string channel_units_c((20 * 8000) + 1,
' ');
829 int32_t n_channels{0};
832 auto output_format =
static_cast<int32_t
>(sim_controls_.
output_format);
835 auto write_vtk =
static_cast<int32_t
>(vtk_settings_.
write_vtk);
836 auto vtk_type =
static_cast<int32_t
>(vtk_settings_.
vtk_type);
839 &is_aerodyn_input_passed_as_string,
840 &aerodyn_input_pointer,
841 &aerodyn_input_length,
842 &is_inflowwind_input_passed_as_string,
843 &inflowwind_input_pointer,
844 &inflowwind_input_length,
858 &store_HH_wind_speed_int,
867 channel_names_c.data(),
868 channel_units_c.data(),
874 sim_controls_.
n_channels =
static_cast<size_t>(n_channels);
879 for (
auto i : std::views::iota(0U, sim_controls_.
n_channels)) {
880 tmp = channel_names_c.substr(20UL * i, 20);
881 tmp.erase(tmp.find_last_not_of(
' ') + 1);
883 tmp = channel_units_c.substr(20UL * i, 20);
884 tmp.erase(tmp.find_last_not_of(
' ') + 1);
889 is_initialized_ =
true;
900 ADI_C_SetRotorMotion =
903 void(
int*,
const float*,
const double*,
const float*,
const float*,
const float*,
const double*,
const float*,
const float*,
const float*,
const double*,
const float*,
const float*,
const int*,
const float*,
const double*,
const float*,
const float*,
int*,
char*)>(
904 "ADI_C_SetRotorMotion"
908 int32_t turbine_number{0};
912 ADI_C_SetRotorMotion(
914 td.hub.position[0].data(),
915 td.hub.orientation[0][0].data(),
916 td.hub.velocity[0].data(),
917 td.hub.acceleration[0].data(),
918 td.nacelle.position[0].data(),
919 td.nacelle.orientation[0][0].data(),
920 td.nacelle.velocity[0].data(),
921 td.nacelle.acceleration[0].data(),
922 td.blade_roots.position[0].data(),
923 td.blade_roots.orientation[0][0].data(),
924 td.blade_roots.velocity[0].data(),
925 td.blade_roots.acceleration[0].data(),
926 &td.blade_nodes.n_points,
927 td.blade_nodes.position[0].data(),
928 td.blade_nodes.orientation[0][0].data(),
929 td.blade_nodes.velocity[0].data(),
930 td.blade_nodes.acceleration[0].data(),
948 auto ADI_C_CalcOutput =
949 lib_.
get_function<void(
double*,
float*,
int*,
char*)>(
"ADI_C_CalcOutput");
960 auto ADI_C_GetRotorLoads =
961 lib_.
get_function<void(
int*,
int*,
float*,
float*,
int*,
char*)>(
"ADI_C_GetRotorLoads");
964 int32_t turbine_number{0};
971 &td.blade_nodes.n_points,
972 td.blade_nodes.load[0].data(),
992 auto ADI_C_UpdateStates =
993 lib_.
get_function<void(
double*,
double*,
int*,
char*)>(
"ADI_C_UpdateStates");
1012 auto ADI_C_End = lib_.
get_function<void(
int*,
char*)>(
"ADI_C_End");
1020 is_initialized_ =
false;
1029 bool is_initialized_{
false};
Wrapper class for the AeroDynInflow (ADI) shared library.
Definition aerodyn_inflow.hpp:669
void Finalize()
Ends the simulation and frees memory.
Definition aerodyn_inflow.hpp:1011
const VTKSettings & GetVTKSettings() const
Definition aerodyn_inflow.hpp:701
void CalculateOutput(double time)
Calculates the output channels at a given time.
Definition aerodyn_inflow.hpp:947
std::vector< std::string > channel_names
Definition aerodyn_inflow.hpp:1024
void Initialize(std::span< const TurbineConfig > turbine_configs)
Initialize the AeroDyn Inflow library.
Definition aerodyn_inflow.hpp:714
void FinalizeInitialization()
Finalizes the initialization process.
Definition aerodyn_inflow.hpp:806
void SetupRotors(std::span< const TurbineConfig > turbine_configs)
Sets up rotor configurations for all turbines.
Definition aerodyn_inflow.hpp:753
const FluidProperties & GetFluidProperties() const
Definition aerodyn_inflow.hpp:699
void SetRotorMotion()
Set up the rotor motion for the current simulation step.
Definition aerodyn_inflow.hpp:898
AeroDynInflowLibrary(const std::string &shared_lib_path="aerodyn_inflow_c_binding.dll", ErrorHandling eh=ErrorHandling{}, FluidProperties fp=FluidProperties{}, EnvironmentalConditions ec=EnvironmentalConditions{}, SimulationControls sc=SimulationControls{}, VTKSettings vtk=VTKSettings{})
Construct a new AeroDynInflowLibrary object.
Definition aerodyn_inflow.hpp:681
const SimulationControls & GetSimulationControls() const
Definition aerodyn_inflow.hpp:700
std::vector< std::string > channel_units
Definition aerodyn_inflow.hpp:1025
std::vector< float > channel_values
Definition aerodyn_inflow.hpp:1026
const ErrorHandling & GetErrorHandling() const
Getter methods for the private member variables.
Definition aerodyn_inflow.hpp:695
const EnvironmentalConditions & GetEnvironmentalConditions() const
Definition aerodyn_inflow.hpp:696
void UpdateStates(double current_time, double next_time)
Updates the states of the AeroDyn Inflow library.
Definition aerodyn_inflow.hpp:991
std::vector< TurbineData > turbines
Definition aerodyn_inflow.hpp:1023
void PreInitialize(size_t n_turbines)
Performs pre-initialization setup.
Definition aerodyn_inflow.hpp:726
T * get_function(const char *symbol_name) const
Definition dylib.hpp:246
C++ cross-platform wrapper around dynamic loading of shared libraries.
Definition aerodyn_inflow.hpp:14
void SetPositionAndOrientation(std::span< const double, 7 > data, std::span< float, 3 > position, std::array< std::array< double, 3 >, 3 > &orientation)
Converts a 7-element array of position and quaternion to separate position and orientation arrays.
Definition aerodyn_inflow.hpp:162
blade
Definition preprocess_windio_exp.py:52
Struct to hold the environmental conditions.
Definition aerodyn_inflow.hpp:84
float water_depth
Definition aerodyn_inflow.hpp:87
float msl_offset
Definition aerodyn_inflow.hpp:88
float gravity
Definition aerodyn_inflow.hpp:85
float atm_pressure
Definition aerodyn_inflow.hpp:86
Struct for error handling settings.
Definition aerodyn_inflow.hpp:50
void CheckError() const
Checks for errors and throws an exception if found.
Definition aerodyn_inflow.hpp:68
std::array< char, kErrorMessagesLength > error_message
Definition aerodyn_inflow.hpp:65
int error_status
Definition aerodyn_inflow.hpp:64
ErrorLevel
Error levels used in InflowWind.
Definition aerodyn_inflow.hpp:52
static constexpr size_t kErrorMessagesLength
Definition aerodyn_inflow.hpp:60
int abort_error_level
Definition aerodyn_inflow.hpp:61
Struct to hold the properties of the working fluid (air)
Definition aerodyn_inflow.hpp:76
float density
Definition aerodyn_inflow.hpp:77
float kinematic_viscosity
Definition aerodyn_inflow.hpp:78
float vapor_pressure
Definition aerodyn_inflow.hpp:80
float sound_speed
Definition aerodyn_inflow.hpp:79
Struct to hold the motion + loads data of any structural mesh component in AeroDyn/InflowWind compati...
Definition aerodyn_inflow.hpp:187
int32_t n_points
Definition aerodyn_inflow.hpp:188
MeshData(size_t n_nodes)
Constructor to initialize all mesh data to zero based on provided number of nodes.
Definition aerodyn_inflow.hpp:198
std::vector< std::array< float, 6 > > velocity
Definition aerodyn_inflow.hpp:192
std::vector< std::array< std::array< double, 3 >, 3 > > orientation
Definition aerodyn_inflow.hpp:191
size_t NumberOfMeshPoints() const
Returns the number of mesh points as size_t.
Definition aerodyn_inflow.hpp:255
MeshData(size_t n_mesh_pts, std::span< const std::array< double, 7 > > pos, std::span< const std::array< float, 6 > > vel, std::span< const std::array< float, 6 > > acc, std::span< const std::array< float, 6 > > ld)
Constructor to initialize all mesh data based on provided inputs.
Definition aerodyn_inflow.hpp:210
std::vector< std::array< float, 6 > > load
Definition aerodyn_inflow.hpp:195
void Validate() const
Definition aerodyn_inflow.hpp:233
std::vector< std::array< float, 3 > > position
Definition aerodyn_inflow.hpp:189
void SetValues(size_t point_number, std::span< const double, 7 > pos, std::span< const double, 6 > vel, std::span< const double, 6 > acc)
Definition aerodyn_inflow.hpp:258
std::vector< std::array< float, 6 > > acceleration
Definition aerodyn_inflow.hpp:194
Struct to hold the settings for simulation controls.
Definition aerodyn_inflow.hpp:574
size_t n_channels
Definition aerodyn_inflow.hpp:616
std::string aerodyn_input
Definition aerodyn_inflow.hpp:595
std::string inflowwind_input
Definition aerodyn_inflow.hpp:596
int interpolation_order
Definition aerodyn_inflow.hpp:599
double total_elapsed_time
Definition aerodyn_inflow.hpp:604
std::string output_root_name
Definition aerodyn_inflow.hpp:614
bool point_load_output
Definition aerodyn_inflow.hpp:609
double max_time
Definition aerodyn_inflow.hpp:603
static constexpr size_t kDefaultStringLength
Definition aerodyn_inflow.hpp:592
double time_step
Definition aerodyn_inflow.hpp:602
OutputFormat
Write output format.
Definition aerodyn_inflow.hpp:585
bool transpose_DCM
Definition aerodyn_inflow.hpp:608
int n_time_steps
Definition aerodyn_inflow.hpp:605
DebugLevel debug_level
Definition aerodyn_inflow.hpp:610
double output_time_step
Definition aerodyn_inflow.hpp:615
DebugLevel
Debug levels used in AeroDyn-Inflow C bindings.
Definition aerodyn_inflow.hpp:576
OutputFormat output_format
Definition aerodyn_inflow.hpp:613
Initial state for a single blade of a turbine.
Definition aerodyn_inflow.hpp:105
std::vector< std::array< double, 7 > > node_initial_positions
Definition aerodyn_inflow.hpp:109
std::array< double, 7 > root_initial_position
Definition aerodyn_inflow.hpp:106
BladeInitialState(std::span< double, 7 > root, std::span< const std::array< double, 7 > > nodes)
Definition aerodyn_inflow.hpp:111
Configuration for the initial state of a turbine.
Definition aerodyn_inflow.hpp:98
std::array< double, 7 > nacelle_initial_position
Definition aerodyn_inflow.hpp:120
TurbineConfig(bool is_hawt, std::span< const float, 3 > ref_pos, std::span< const double, 7 > hub_pos, std::span< const double, 7 > nacelle_pos, std::span< const BladeInitialState > blade_states)
Definition aerodyn_inflow.hpp:124
std::array< float, 3 > reference_position
Definition aerodyn_inflow.hpp:118
void Validate() const
Definition aerodyn_inflow.hpp:137
std::array< double, 7 > hub_initial_position
Definition aerodyn_inflow.hpp:119
bool is_horizontal_axis
Definition aerodyn_inflow.hpp:117
std::vector< BladeInitialState > blade_initial_states
Definition aerodyn_inflow.hpp:122
size_t NumberOfBlades() const
Returns the number of blades in the turbine.
Definition aerodyn_inflow.hpp:152
Struct to hold and manage turbine-specific data.
Definition aerodyn_inflow.hpp:280
void SetBladeNodeMotion(size_t blade_number, size_t node_number, const std::array< double, 7 > &position, const std::array< double, 6 > &velocity, const std::array< double, 6 > &acceleration)
Sets the blade node values based on blade number and node number.
Definition aerodyn_inflow.hpp:389
MeshData blade_roots
Definition aerodyn_inflow.hpp:284
void SetNacelleMotion(const std::array< double, 7 > &position, const std::array< double, 6 > &velocity, const std::array< double, 6 > &acceleration)
Sets the nacelle motion values.
Definition aerodyn_inflow.hpp:483
std::array< double, 6 > GetBladeNodeLoad(size_t blade_number, size_t node_number) const
Gets the blade node loads based on blade number and node number.
Definition aerodyn_inflow.hpp:499
void SetBladeRootMotion(size_t blade_number, const std::array< double, 7 > &position, const std::array< double, 6 > &velocity, const std::array< double, 6 > &acceleration)
Sets the blade root values based on blade number.
Definition aerodyn_inflow.hpp:430
MeshData hub
Definition aerodyn_inflow.hpp:282
std::array< float, 3 > hh_vel
Definition aerodyn_inflow.hpp:286
void Validate() const
Definition aerodyn_inflow.hpp:333
MeshData nacelle
Definition aerodyn_inflow.hpp:283
std::vector< int32_t > blade_nodes_to_blade_num_mapping
Mapping of blade nodes to blade numbers (1D array)
Definition aerodyn_inflow.hpp:295
TurbineData(const TurbineConfig &tc)
Constructor for TurbineData based on a TurbineConfig object.
Definition aerodyn_inflow.hpp:315
std::vector< std::vector< size_t > > node_indices_by_blade
Unique indices of nodes for each blade (2D array)
Definition aerodyn_inflow.hpp:305
size_t NumberOfBlades() const
Returns the number of blades as size_t.
Definition aerodyn_inflow.hpp:373
int32_t n_blades
Definition aerodyn_inflow.hpp:281
void SetHubMotion(const std::array< double, 7 > &position, const std::array< double, 6 > &velocity, const std::array< double, 6 > &acceleration)
Sets the hub motion values.
Definition aerodyn_inflow.hpp:466
MeshData blade_nodes
Definition aerodyn_inflow.hpp:285
Struct to hold the settings for VTK output.
Definition aerodyn_inflow.hpp:625
OutputType vtk_type
Definition aerodyn_inflow.hpp:642
float vtk_hub_radius
Definition aerodyn_inflow.hpp:647
std::string output_dir_name
Definition aerodyn_inflow.hpp:640
double vtk_dt
Definition aerodyn_inflow.hpp:643
WriteType write_vtk
Definition aerodyn_inflow.hpp:641
std::array< float, 6 > vtk_nacelle_dimensions
Definition aerodyn_inflow.hpp:644
WriteType
Write type.
Definition aerodyn_inflow.hpp:627
OutputType
Mesh output type.
Definition aerodyn_inflow.hpp:634