diff --git a/src/cpp/fs/ArgumentParser.cpp b/src/cpp/fs/ArgumentParser.cpp index 2b16e72c24..1dce936e87 100644 --- a/src/cpp/fs/ArgumentParser.cpp +++ b/src/cpp/fs/ArgumentParser.cpp @@ -524,7 +524,7 @@ MainArgumentParser::MainArgumentParser(const int argc, const char* const argv[]) settings.fuel_lookup, "--fuel-lut", "Use specified fuel lookup table", false ); register_setter< - DurationSize>(settings.utc_offset, "--tz", "UTC offset (hours)", true, &parse_value); + DurationSize>(settings.utc_offset, "--tz", "UTC offset (hours)", false, &parse_value); register_setter( [&](const auto v) { settings.static_curing = v; }, "--curing", diff --git a/src/cpp/fs/Settings.h b/src/cpp/fs/Settings.h index 105387d017..1c03190853 100644 --- a/src/cpp/fs/Settings.h +++ b/src/cpp/fs/Settings.h @@ -145,7 +145,7 @@ class Settings // Minimum Fine Fuel Moisture Code required for spread during the night MathSize minimum_ffmc_at_night{0.0}; // Offset from UTC to use for entire simulation (hours) - DurationSize utc_offset{0.0}; + std::optional utc_offset{}; // Offset from sunrise at which the day is considered to start (hours) DurationSize offset_sunrise{0.0}; // Offset from sunrise at which the day is considered to end (hours) diff --git a/src/cpp/fs/StartPoint.cpp b/src/cpp/fs/StartPoint.cpp index 5ff6561b59..760e3b3764 100644 --- a/src/cpp/fs/StartPoint.cpp +++ b/src/cpp/fs/StartPoint.cpp @@ -94,12 +94,28 @@ static array, MAX_DAYS> make_days( static const Settings& settings = settings::instance(); array, MAX_DAYS> days{}; array day_length_hours{}; + constexpr auto DEGREES_PER_TZ_HOUR = 15.0; + const auto tz_calculated = floor(longitude / DEGREES_PER_TZ_HOUR); + auto utc_offset = settings.utc_offset.value_or(tz_calculated); + if (!settings.utc_offset.has_value()) + { + logging::note("Using calculated timezone offset of ({:0.1g}) since not specified", utc_offset); + } + else if (1 < abs(tz_calculated - utc_offset)) + { + logging::warning( + "Specified timezone ({:0.1g}) differs from calculated timezone ({:0.1g}) by {:0.1g} hours", + utc_offset, + tz_calculated, + (tz_calculated - utc_offset) + ); + } for (size_t i = 0; i < day_length_hours.size(); ++i) { const auto [sunrise, sunset] = sunrise_sunset(static_cast(i), latitude, longitude); days[i] = make_tuple( - fix_hours(sunrise + settings.utc_offset + settings.offset_sunrise), - fix_hours(sunset + settings.utc_offset - settings.offset_sunset) + fix_hours(sunrise + utc_offset + settings.offset_sunrise), + fix_hours(sunset + utc_offset - settings.offset_sunset) ); day_length_hours[i] = get<1>(days[i]) - get<0>(days[i]); }