rename bilinearinterpolate
This commit is contained in:
parent
84674c36de
commit
9cf2133e91
|
|
@ -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)};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue