| Conditions | 4 |
| Total Lines | 95 |
| Code Lines | 29 |
| Lines | 0 |
| Ratio | 0 % |
| Changes | 0 | ||
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
| 1 | # Copyright (C) 2019 NRL |
||
| 44 | def subsol(year, doy, utime): |
||
| 45 | """Finds subsolar geocentric longitude and latitude. |
||
| 46 | |||
| 47 | Parameters |
||
| 48 | ---------- |
||
| 49 | year : (int) |
||
| 50 | Calendar year between 1601 and 2100 |
||
| 51 | doy : (int) |
||
| 52 | Day of year between 1-365/366 |
||
| 53 | utime : (float) |
||
| 54 | Seconds since midnight on the specified day |
||
| 55 | |||
| 56 | Returns |
||
| 57 | ------- |
||
| 58 | sbsllon : (float) |
||
| 59 | Subsolar longitude in degrees E for the given date/time |
||
| 60 | sbsllat : (float) |
||
| 61 | Subsolar latitude in degrees N for the given date/time |
||
| 62 | |||
| 63 | Notes |
||
| 64 | ----- |
||
| 65 | Based on formulas in Astronomical Almanac for the year 1996, p. C24. |
||
| 66 | (U.S. Government Printing Office, 1994). Usable for years 1601-2100, |
||
| 67 | inclusive. According to the Almanac, results are good to at least 0.01 |
||
| 68 | degree latitude and 0.025 degrees longitude between years 1950 and 2050. |
||
| 69 | Accuracy for other years has not been tested. Every day is assumed to have |
||
| 70 | exactly 86400 seconds; thus leap seconds that sometimes occur on December |
||
| 71 | 31 are ignored (their effect is below the accuracy threshold of the |
||
| 72 | algorithm). |
||
| 73 | |||
| 74 | References |
||
| 75 | ---------- |
||
| 76 | After Fortran code by A. D. Richmond, NCAR. Translated from IDL |
||
| 77 | by K. Laundal. |
||
| 78 | |||
| 79 | """ |
||
| 80 | |||
| 81 | # Convert from 4 digit year to 2 digit year |
||
| 82 | yr2 = year - 2000 |
||
| 83 | |||
| 84 | if year >= 2101: |
||
| 85 | aacgmv2.logger.error('subsol invalid after 2100. Input year is:', year) |
||
| 86 | |||
| 87 | # Determine if this year is a leap year |
||
| 88 | nleap = np.floor((year - 1601) / 4) |
||
| 89 | nleap = nleap - 99 |
||
| 90 | if year <= 1900: |
||
| 91 | if year <= 1600: |
||
| 92 | print('subsol.py: subsol invalid before 1601. Input year is:', year) |
||
| 93 | ncent = np.floor((year - 1601) / 100) |
||
| 94 | ncent = 3 - ncent |
||
| 95 | nleap = nleap + ncent |
||
| 96 | |||
| 97 | # Calculate some of the coefficients needed to deterimine the mean longitude |
||
| 98 | # of the sun and the mean anomaly |
||
| 99 | l_0 = -79.549 + (-0.238699 * (yr2 - 4 * nleap) + 3.08514e-2 * nleap) |
||
| 100 | g_0 = -2.472 + (-0.2558905 * (yr2 - 4 * nleap) - 3.79617e-2 * nleap) |
||
| 101 | |||
| 102 | # Days (including fraction) since 12 UT on January 1 of IYR2: |
||
| 103 | dfrac = (utime / 86400 - 1.5) + doy |
||
| 104 | |||
| 105 | # Mean longitude of Sun: |
||
| 106 | l_sun = l_0 + 0.9856474 * dfrac |
||
| 107 | |||
| 108 | # Mean anomaly: |
||
| 109 | grad = np.radians(g_0 + 0.9856003 * dfrac) |
||
| 110 | |||
| 111 | # Ecliptic longitude: |
||
| 112 | lmrad = np.radians(l_sun + 1.915 * np.sin(grad) + 0.020 * np.sin(2 * grad)) |
||
| 113 | sinlm = np.sin(lmrad) |
||
| 114 | |||
| 115 | # Days (including fraction) since 12 UT on January 1 of 2000: |
||
| 116 | epoch_day = dfrac + 365.0 * yr2 + nleap |
||
| 117 | |||
| 118 | # Obliquity of ecliptic: |
||
| 119 | epsrad = np.radians(23.439 - 4.0e-7 * epoch_day) |
||
| 120 | |||
| 121 | # Right ascension: |
||
| 122 | alpha = np.degrees(np.arctan2(np.cos(epsrad) * sinlm, np.cos(lmrad))) |
||
| 123 | |||
| 124 | # Declination, which is the subsolar latitude: |
||
| 125 | sbsllat = np.degrees(np.arcsin(np.sin(epsrad) * sinlm)) |
||
| 126 | |||
| 127 | # Equation of time (degrees): |
||
| 128 | etdeg = l_sun - alpha |
||
| 129 | etdeg = etdeg - 360.0 * np.round(etdeg / 360.0) |
||
| 130 | |||
| 131 | # Apparent time (degrees): |
||
| 132 | aptime = utime / 240.0 + etdeg # Earth rotates one degree every 240 s. |
||
| 133 | |||
| 134 | # Subsolar longitude: |
||
| 135 | sbsllon = 180.0 - aptime |
||
| 136 | sbsllon = sbsllon - 360.0 * np.round(sbsllon / 360.0) |
||
| 137 | |||
| 138 | return sbsllon, sbsllat |
||
| 139 | |||
| 211 |