IAP GITLAB

Skip to content
Snippets Groups Projects
Commit 3276b869 authored by André Schmidt's avatar André Schmidt
Browse files

Merge branch 'wmm-andre' of gitlab.iap.kit.edu:AirShowerPhysics/corsika into wmm-andre

parents 0f108ca8 a2d03486
No related branches found
No related tags found
No related merge requests found
Pipeline #5925 failed
......@@ -123,14 +123,21 @@ namespace corsika {
if (longitude < -180 || longitude > 180) {
CORSIKA_LOG_WARN("Longitude should be between -180 and 180 degree.");
}
double epoch = double(iEpoch->first);
const double lat_geo = latitude * constants::pi / 180;
const double lon = longitude * constants::pi / 180;
double const epoch = double(iEpoch->first);
auto iNextEpoch = iEpoch; // next epoch for interpolation
--iNextEpoch;
bool const lastEpoch = (iEpoch == parameters_.rbegin());
auto const delta_t = year - epoch;
CORSIKA_LOG_DEBUG(
"identified: t_epoch={}, delta_t={}, lastEpoch={} (false->interpolate)", epoch,
delta_t, lastEpoch);
double const lat_geo = latitude * constants::pi / 180;
double const lon = longitude * constants::pi / 180;
// Transform into spherical coordinates
const double f = 1 / 298.257223563;
const double e_squared = f * (2 - f);
double constexpr f = 1 / 298.257223563;
double constexpr e_squared = f * (2 - f);
LengthType R_c =
constants::EarthRadius::Equatorial / sqrt(1 - e_squared * pow(sin(lat_geo), 2));
LengthType p = (R_c + altitude) * cos(lat_geo);
......@@ -141,18 +148,20 @@ namespace corsika {
double legendre, next_legendre, derivate_legendre;
double magneticfield[3] = {0, 0, 0};
// loop the different l-functions
for (size_t j = 0; j < iEpoch->second.size(); j++) {
ParameterLine p = iEpoch->second[j];
// Time interpolation
if (iEpoch == parameters_.rbegin() || p.dg != 0 || p.dh != 0) {
if (iEpoch == parameters_.rbegin()) {
// this is the latest epoch in time, or time-dependence (dg/dh) was specified
// we use the extrapolation factors dg/dh:
p.g = p.g + (year - epoch) * p.dg;
p.h = p.h + (year - epoch) * p.dh;
p.g = p.g + delta_t * p.dg;
p.h = p.h + delta_t * p.dh;
} else {
// we linearly interpolate between two epochs
<<<<<<< HEAD
auto const nextEpoch = --iEpoch; // next epoch
ParameterLine const next_p = nextEpoch->second[j];
const double length = nextEpoch->first - epoch;
......@@ -161,6 +170,19 @@ namespace corsika {
CORSIKA_LOG_WARN("g {}. h {}", next_p.g, next_p.h);
p.g = p.g + (next_p.g - p.g) * (year - epoch) / length;
p.h = p.h + (next_p.h - p.h) * (year - epoch) / length;
=======
ParameterLine const next_p = iNextEpoch->second[j];
double const length = iNextEpoch->first - epoch;
double p_g = p.g + (next_p.g - p.g) * delta_t / length;
double p_h = p.h + (next_p.h - p.h) * delta_t / length;
CORSIKA_LOG_TRACE(
"interpolation: delta-g={}, delta-h={}, delta-t={}, length={} g1={} g2={} "
"g={} h={} ",
next_p.g - p.g, next_p.h - p.h, year - epoch, length, next_p.g, p.g, p_g,
p_h);
p.g = p_g;
p.h = p_h;
>>>>>>> a2d03486f61486e62ba1c7e567bd640c329f4c12
}
legendre = pow(-1, p.m) * std::assoc_legendre(p.n, p.m, sin(lat_sph));
......
......@@ -105,6 +105,7 @@ TEST_CASE("UniformMagneticField w/ Homogeneous Medium") {
CHECK(WMM_B_4.getY(gCS) / 1_nT == Approx(186).margin(0.5));
CHECK(WMM_B_4.getZ(gCS) / 1_nT == Approx(-52429).margin(0.5));
}
{
GeomagneticModel igrf(gOrigin, corsika_data("GeoMag/IGRF13.COF"));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment