|
| 1 | +// alpha_profile.h |
| 2 | +#pragma once |
| 3 | + |
| 4 | +#include <algorithm> |
| 5 | +#include <cmath> |
| 6 | +#include <cstddef> |
| 7 | +#include <limits> |
| 8 | +#include <stdexcept> |
| 9 | +#include <utility> |
| 10 | +#include <vector> |
| 11 | +#include <utils/math.h> |
| 12 | + |
| 13 | + |
| 14 | +// ----------------------------- |
| 15 | +// TaperSection |
| 16 | +// ----------------------------- |
| 17 | +class TaperSection { |
| 18 | +public: |
| 19 | + TaperSection() = default; |
| 20 | + |
| 21 | + TaperSection( |
| 22 | + std::vector<double> z_array, |
| 23 | + std::vector<double> radius_array, |
| 24 | + double heating_length_initial = std::numeric_limits<double>::quiet_NaN(), |
| 25 | + double heating_length_final = std::numeric_limits<double>::quiet_NaN()) |
| 26 | + : z_array_(std::move(z_array)), |
| 27 | + radius_array_(std::move(radius_array)), |
| 28 | + heating_length_initial_(heating_length_initial), |
| 29 | + heating_length_final_(heating_length_final) |
| 30 | + { |
| 31 | + if (z_array_.size() != radius_array_.size()) { |
| 32 | + throw std::invalid_argument("TaperSection: z_array and radius_array size mismatch."); |
| 33 | + } |
| 34 | + if (z_array_.empty()) throw std::invalid_argument("TaperSection: arrays must not be empty."); |
| 35 | + if (!std::is_sorted(z_array_.begin(), z_array_.end())) { |
| 36 | + throw std::invalid_argument("TaperSection: z_array must be sorted ascending."); |
| 37 | + } |
| 38 | + } |
| 39 | + |
| 40 | + double z_initial() const { return z_array_.front(); } |
| 41 | + double z_final() const { return z_array_.back(); } |
| 42 | + double radius_initial() const { return radius_array_.front(); } |
| 43 | + double radius_final() const { return radius_array_.back(); } |
| 44 | + bool is_constant() const { return radius_array_.front() == radius_array_.back(); } |
| 45 | + |
| 46 | + double heating_length_initial() const { return heating_length_initial_; } |
| 47 | + double heating_length_final() const { return heating_length_final_; } |
| 48 | + |
| 49 | + const std::vector<double>& z_array() const { return z_array_; } |
| 50 | + const std::vector<double>& radius_array() const { return radius_array_; } |
| 51 | + |
| 52 | + // Similar to scipy interp1d(bounds_error=False, fill_value=0) |
| 53 | + LinearInterpolator interpolation(bool bounds_error = false, double fill_value = 0.0) const { |
| 54 | + return LinearInterpolator(z_array_, radius_array_, bounds_error, fill_value); |
| 55 | + } |
| 56 | + |
| 57 | +private: |
| 58 | + std::vector<double> z_array_; |
| 59 | + std::vector<double> radius_array_; |
| 60 | + double heating_length_initial_ = std::numeric_limits<double>::quiet_NaN(); |
| 61 | + double heating_length_final_ = std::numeric_limits<double>::quiet_NaN(); |
| 62 | +}; |
0 commit comments