Skip to content

Commit c55f52f

Browse files
committed
update
1 parent 1f0e109 commit c55f52f

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed

SuPyMode/cpp/taper/taper_section.h

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
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

Comments
 (0)