rename bilinearinterpolate

This commit is contained in:
robin 2024-05-01 12:57:34 +02:00
parent 84674c36de
commit 9cf2133e91
5 changed files with 25 additions and 25 deletions

View File

@ -7,7 +7,7 @@ using namespace std;
EulerAdvectionKernel::EulerAdvectionKernel(std::shared_ptr<UVGrid> grid): grid(grid) { } EulerAdvectionKernel::EulerAdvectionKernel(std::shared_ptr<UVGrid> grid): grid(grid) { }
std::pair<double, double> EulerAdvectionKernel::advect(int time, double latitude, double longitude) const { std::pair<double, double> EulerAdvectionKernel::advect(int time, double latitude, double longitude) const {
auto [u, v] = bilinearinterpolation(*grid, time, latitude, longitude); auto [u, v] = bilinearinterpolate(*grid, time, latitude, longitude);
return {latitude+metreToDegrees(u*DT), longitude+metreToDegrees(v*DT)}; return {latitude+metreToDegrees(u*DT), longitude+metreToDegrees(v*DT)};
} }

View File

@ -6,27 +6,27 @@ using namespace std;
RK4AdvectionKernel::RK4AdvectionKernel(std::shared_ptr<UVGrid> grid): grid(grid) { } RK4AdvectionKernel::RK4AdvectionKernel(std::shared_ptr<UVGrid> grid): grid(grid) { }
std::pair<double, double> RK4AdvectionKernel::advect(int time, double latitude, double longitude) const { std::pair<double, double> RK4AdvectionKernel::advect(int time, double latitude, double longitude) const {
auto [u1, v1] = bilinearinterpolation(*grid, time, latitude, longitude); auto [u1, v1] = bilinearinterpolate(*grid, time, latitude, longitude);
// lon1, lat1 = (particle.lon + u1*.5*particle.dt, particle.lat + v1*.5*particle.dt); // lon1, lat1 = (particle.lon + u1*.5*particle.dt, particle.lat + v1*.5*particle.dt);
double lon1 = longitude + metreToDegrees(u1 * 0.5*DT); double lon1 = longitude + metreToDegrees(u1 * 0.5*DT);
double lat1 = latitude + metreToDegrees(v1 * 0.5*DT); double lat1 = latitude + metreToDegrees(v1 * 0.5*DT);
// (u2, v2) = fieldset.UV[time + .5 * particle.dt, particle.depth, lat1, lon1, particle] // (u2, v2) = fieldset.UV[time + .5 * particle.dt, particle.depth, lat1, lon1, particle]
auto [u2, v2] = bilinearinterpolation(*grid, time + 0.5*DT, lat1, lon1); auto [u2, v2] = bilinearinterpolate(*grid, time + 0.5 * DT, lat1, lon1);
// lon2, lat2 = (particle.lon + u2*.5*particle.dt, particle.lat + v2*.5*particle.dt) // lon2, lat2 = (particle.lon + u2*.5*particle.dt, particle.lat + v2*.5*particle.dt)
double lon2 = longitude + metreToDegrees(u2 * 0.5 * DT); double lon2 = longitude + metreToDegrees(u2 * 0.5 * DT);
double lat2 = latitude + metreToDegrees(v2 * 0.5 * DT); double lat2 = latitude + metreToDegrees(v2 * 0.5 * DT);
// (u3, v3) = fieldset.UV[time + .5 * particle.dt, particle.depth, lat2, lon2, particle] // (u3, v3) = fieldset.UV[time + .5 * particle.dt, particle.depth, lat2, lon2, particle]
auto [u3, v3] = bilinearinterpolation(*grid, time + 0.5 * DT, lat2, lon2); auto [u3, v3] = bilinearinterpolate(*grid, time + 0.5 * DT, lat2, lon2);
// lon3, lat3 = (particle.lon + u3*particle.dt, particle.lat + v3*particle.dt) // lon3, lat3 = (particle.lon + u3*particle.dt, particle.lat + v3*particle.dt)
double lon3 = longitude + metreToDegrees(u3 * DT); double lon3 = longitude + metreToDegrees(u3 * DT);
double lat3 = latitude + metreToDegrees(v3 * DT); double lat3 = latitude + metreToDegrees(v3 * DT);
// (u4, v4) = fieldset.UV[time + particle.dt, particle.depth, lat3, lon3, particle] // (u4, v4) = fieldset.UV[time + particle.dt, particle.depth, lat3, lon3, particle]
auto [u4, v4] = bilinearinterpolation(*grid, time + DT, lat3, lon3); auto [u4, v4] = bilinearinterpolate(*grid, time + DT, lat3, lon3);
double lonFinal = longitude + metreToDegrees((u1 + 2 * u2 + 2 * u3 + u4) / 6.0 * DT); double lonFinal = longitude + metreToDegrees((u1 + 2 * u2 + 2 * u3 + u4) / 6.0 * DT);
double latFinal = latitude + metreToDegrees((v1 + 2 * v2 + 2 * v3 + v4) / 6.0 * DT); double latFinal = latitude + metreToDegrees((v1 + 2 * v2 + 2 * v3 + v4) / 6.0 * DT);

View File

@ -2,7 +2,7 @@
using namespace std; using namespace std;
Vel bilinearinterpolation(const UVGrid &uvGrid, int time, double lat, double lon) { Vel bilinearinterpolate(const UVGrid &uvGrid, int time, double lat, double lon) {
double latStep = uvGrid.latStep(); double latStep = uvGrid.latStep();
double lonStep = uvGrid.lonStep(); double lonStep = uvGrid.lonStep();
int timeStep = uvGrid.timeStep(); int timeStep = uvGrid.timeStep();
@ -40,7 +40,7 @@ vector<Vel> bilinearinterpolation(const UVGrid &uvGrid, vector<tuple<int, double
vector<Vel> result; vector<Vel> result;
result.reserve(points.size()); result.reserve(points.size());
for (auto [time, lat, lon]: points) { for (auto [time, lat, lon]: points) {
result.push_back(bilinearinterpolation(uvGrid, time, lat, lon)); result.push_back(bilinearinterpolate(uvGrid, time, lat, lon));
} }
return result; return result;

View File

@ -15,7 +15,7 @@
* @param lon longitude of point * @param lon longitude of point
* @return interpolated velocity * @return interpolated velocity
*/ */
Vel bilinearinterpolation(const UVGrid &uvGrid, int time, double lat, double lon); Vel bilinearinterpolate(const UVGrid &uvGrid, int time, double lat, double lon);
/** /**
* Helper function for bilnearly interpolating a vector of points * Helper function for bilnearly interpolating a vector of points

View File

@ -37,25 +37,25 @@ void advectForSomeTime(const UVGrid &uvGrid, const AdvectionKernelImpl &kernel,
void testGridIndexing(const UVGrid *uvGrid) { void testGridIndexing(const UVGrid *uvGrid) {
int time = 20000; int time = 20000;
cout << "=== land === (should all give 0)" << endl; cout << "=== land === (should all give 0)" << endl;
cout << bilinearinterpolation(*uvGrid, time, 53.80956379699079, -1.6496306344654406) << endl; cout << bilinearinterpolate(*uvGrid, time, 53.80956379699079, -1.6496306344654406) << endl;
cout << bilinearinterpolation(*uvGrid, time, 55.31428895563707, -2.851581041325997) << endl; cout << bilinearinterpolate(*uvGrid, time, 55.31428895563707, -2.851581041325997) << endl;
cout << bilinearinterpolation(*uvGrid, time, 47.71548983067583, -1.8704054037408626) << endl; cout << bilinearinterpolate(*uvGrid, time, 47.71548983067583, -1.8704054037408626) << endl;
cout << bilinearinterpolation(*uvGrid, time, 56.23521060314398, 8.505979324950573) << endl; cout << bilinearinterpolate(*uvGrid, time, 56.23521060314398, 8.505979324950573) << endl;
cout << bilinearinterpolation(*uvGrid, time, 53.135645440244375, 8.505979324950573) << endl; cout << bilinearinterpolate(*uvGrid, time, 53.135645440244375, 8.505979324950573) << endl;
cout << bilinearinterpolation(*uvGrid, time, 56.44761278775708, -4.140629303756164) << endl; cout << bilinearinterpolate(*uvGrid, time, 56.44761278775708, -4.140629303756164) << endl;
cout << bilinearinterpolation(*uvGrid, time, 52.67625153110339, 0.8978569759455872) << endl; cout << bilinearinterpolate(*uvGrid, time, 52.67625153110339, 0.8978569759455872) << endl;
cout << bilinearinterpolation(*uvGrid, time, 52.07154079279377, 4.627951041411331) << endl; cout << bilinearinterpolate(*uvGrid, time, 52.07154079279377, 4.627951041411331) << endl;
cout << "=== ocean === (should give not 0)" << endl; cout << "=== ocean === (should give not 0)" << endl;
cout << bilinearinterpolation(*uvGrid, time, 47.43923166616274, -4.985451481829083) << endl; cout << bilinearinterpolate(*uvGrid, time, 47.43923166616274, -4.985451481829083) << endl;
cout << bilinearinterpolation(*uvGrid, time, 50.68943556852362, -9.306162999561733) << endl; cout << bilinearinterpolate(*uvGrid, time, 50.68943556852362, -9.306162999561733) << endl;
cout << bilinearinterpolation(*uvGrid, time, 53.70606799886677, -4.518347647034465) << endl; cout << bilinearinterpolate(*uvGrid, time, 53.70606799886677, -4.518347647034465) << endl;
cout << bilinearinterpolation(*uvGrid, time, 60.57987114267971, -12.208262973672621) << endl; cout << bilinearinterpolate(*uvGrid, time, 60.57987114267971, -12.208262973672621) << endl;
cout << bilinearinterpolation(*uvGrid, time, 46.532221548197285, -13.408189172582638) << endl; cout << bilinearinterpolate(*uvGrid, time, 46.532221548197285, -13.408189172582638) << endl;
cout << bilinearinterpolation(*uvGrid, time, 50.92725094937812, 1.3975824052375256) << endl; cout << bilinearinterpolate(*uvGrid, time, 50.92725094937812, 1.3975824052375256) << endl;
cout << bilinearinterpolation(*uvGrid, time, 51.4028921682209, 2.4059571950925203) << endl; cout << bilinearinterpolate(*uvGrid, time, 51.4028921682209, 2.4059571950925203) << endl;
cout << bilinearinterpolation(*uvGrid, time, 53.448445236769004, 0.7996966058017515) << endl; cout << bilinearinterpolate(*uvGrid, time, 53.448445236769004, 0.7996966058017515) << endl;
// cout << bilinearinterpolation(*uvGrid, time, ) << endl; // cout << bilinearinterpolate(*uvGrid, time, ) << endl;
} }
int main() { int main() {