4template <auto po
intLonA, auto po
intLatA, auto po
intLonB, auto po
intLatB>
9 auto projectionFunctionForward,
10 auto projectionFunctionInverse
12 constexpr auto aLon = pointLonA;
13 constexpr auto aLat = pointLatA;
15 constexpr auto bLon = pointLonB;
16 constexpr auto bLat = pointLatB;
18 const auto [lon, lat] = projectionFunctionInverse(x, y);
21 auto pressureGaus = [](
const auto x,
const auto y) {
23 constexpr auto AL = 37.61;
24 constexpr auto AR = 4.665;
25 constexpr auto BL = 0.31;
26 constexpr auto BR = 0.5;
27 const auto y2 = ((
y / C) * (y / C));
29 return -AL * 100 *
x * std::exp(-y2 - ((x / BL) * (x / BL)));
32 return -AR * 100 *
x * std::exp(-y2 - ((x / BR) * (x / BR)));
37 auto distanceOverTime = [](
const auto t) {
38 constexpr auto speed = 20.0;
42 auto pointOnVector = [projectionFunctionForward](
const auto l) {
46 static const auto A = projectionFunctionForward(aLon, aLat);
47 static const auto B = projectionFunctionForward(bLon, bLat);
48 static const auto dx = B.first - A.first;
49 static const auto dy = B.second - A.second;
50 static const double dist = std::hypot(dx, dy);
52 const double t = (dist > 0.0) ? (l / dist) : 0.0;
54 const double x = A.first + t * dx;
55 const double y = A.second + t * dy;
57 return std::pair{
x,
y};
62 auto rotLonLatOffsets =
63 [projectionFunctionForward](
const auto lon,
const auto lat,
const auto centerLon,
const auto centerLat) {
67 static const auto A = projectionFunctionForward(aLon, aLat);
68 static const auto B = projectionFunctionForward(bLon, bLat);
69 static const auto distanceX = B.first - A.first;
70 static const auto distanceY = B.second - A.second;
72 static const auto rad = std::atan2(distanceY, distanceX);
74 static const auto s = std::sin(rad);
75 static const auto c = std::cos(rad);
82 const auto offsetLon = lon - centerLon;
83 const auto offsetLat = lat - centerLat;
85 const auto unwrapLon = std::remainder(offsetLon, 360.0);
86 constexpr double D2R = M_PI / 180.0;
87 const auto scalingFactor = std::cos(centerLat * D2R);
88 const auto scaledLon = unwrapLon * scalingFactor;
90 const auto newLon = (scaledLon * c) + (offsetLat * s);
91 const auto newLat = (-scaledLon *
s) + (offsetLat * c);
93 const auto normalisedLon = std::abs(scalingFactor) > 1e-12 ? (newLon / scalingFactor) : 0.0;
94 return std::pair{normalisedLon, newLat};
97 const auto distance = distanceOverTime(t);
98 const auto [centerX, centerY] = pointOnVector(distance);
103 const auto [centerLon, centerLat] = projectionFunctionInverse(centerX, centerY);
105 const auto [rotLon, rotLat] = rotLonLatOffsets(lon, lat, centerLon, centerLat);
106 return pressureGaus(rotLon, rotLat);
static auto atmosphericPressure(const auto x, const auto y, const auto t, auto projectionFunctionForward, auto projectionFunctionInverse)
Computes the moving atmospheric pressure disturbance for the Gulf of Mexico test case.