Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OverflowError: math range error when calculating get_radiation_direct at sunrise. #148

Open
SamuelLarkin opened this issue Apr 1, 2022 · 3 comments

Comments

@SamuelLarkin
Copy link

Hi,
I came across a bug where, at first glance, there seems to be a problem calculating the direct radiation right around sunrise and sunset.

Here's the error message.

2022-03-29 06:36:32 - collector.elevation - INFO - Going up.
Exception in thread Collector:
Traceback (most recent call last):
  File "/usr/lib/python3.9/threading.py", line 954, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.9/threading.py", line 892, in run
    self._target(*self._args, **self._kwargs)
  File "/home/balta/git/Hepa/collector/collector.py", line 537, in run
    self.update_sun_position()
  File "/home/balta/git/Hepa/collector/collector.py", line 519, in update_sun_position
    self.sun.update(
  File "/home/balta/git/Hepa/collector/collector.py", line 95, in update
    rad = radiation.get_radiation_direct(date, self.elevation)
  File "/home/balta/git/Hepa/venv/lib/python3.9/site-packages/pysolar/radiation.py", line 50, in get_radiation_direct
    return flux * math.exp(-1 * optical_depth * air_mass_ratio) * is_daytime
OverflowError: math range error

I'm using pysolar==0.10.

@pingswept
Copy link
Owner

Yeah, that looks like a bug.

Could you post the inputs that produced the error?

@SamuelLarkin
Copy link
Author

SamuelLarkin commented Apr 3, 2022

Sorry for the wait. My logging was insufficient to reproduce the bug with the info I had.

Here's a snippet that should help you reproduce the bug.

import datetime
import pytz
from math import isfinite
from pysolar.solar import (
            get_position as get_sun_position,
            radiation,
            )
latitude  = 45.4924
longitude = -72.3150
date = datetime.datetime(2022, 4, 3, 10, 27, 15, 830398, tzinfo=datetime.timezone.utc)
azymuth, elevation = get_sun_position(latitude, longitude, date)
rad = radiation.get_radiation_direct(date, elevation)

In get_radiation_direct radiation.py:50
we have this code return flux * math.exp(-1 * optical_depth * air_mass_ratio) * is_daytime

air_mass_ratio: -961255.0150425568
altitude_deg: -5.960518136860493e-05
day: 93
flux=1159.3544752333482
is_daytime: False
optical_depth: 0.16979271842852264
when: datetime

then math.exp(-1 * optical_depth * air_mass_ratio) is yielding OverflowError: math range error.

I'm wondering why bother do that math.exp() if we then multiply it by False which is 0?

Unfortunately, I'm not knowledgeable enough in the math behind computing the sun's radiation to properly solve this.

@pingswept
Copy link
Owner

That’s trying to calculate roughly e^100000, which is around 10^43000, so that’s where the overflow is happening.

I suspect the right solution is to alter get_air_mass_ratio() so that it is restricted to a reasonable range.

Patches welcome, if anyone wants to think that through.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants