Conditions | 4 |
Total Lines | 97 |
Code Lines | 27 |
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 |
||
42 | def subsol(year, doy, utime): |
||
43 | """Find subsolar geocentric longitude and latitude. |
||
44 | |||
45 | Parameters |
||
46 | ---------- |
||
47 | year : int |
||
48 | Calendar year between 1601 and 2100 |
||
49 | doy : int |
||
50 | Day of year between 1-365/366 |
||
51 | utime : float |
||
52 | Seconds since midnight on the specified day |
||
53 | |||
54 | Returns |
||
55 | ------- |
||
56 | sbsllon : float |
||
57 | Subsolar longitude in degrees E for the given date/time |
||
58 | sbsllat : float |
||
59 | Subsolar latitude in degrees N for the given date/time |
||
60 | |||
61 | Raises |
||
62 | ------ |
||
63 | ValueError |
||
64 | If year is out of range |
||
65 | |||
66 | Notes |
||
67 | ----- |
||
68 | Based on formulas in Astronomical Almanac for the year 1996, p. C24. |
||
69 | (U.S. Government Printing Office, 1994). Usable for years 1601-2100, |
||
70 | inclusive. According to the Almanac, results are good to at least 0.01 |
||
71 | degree latitude and 0.025 degrees longitude between years 1950 and 2050. |
||
72 | Accuracy for other years has not been tested. Every day is assumed to have |
||
73 | exactly 86400 seconds; thus leap seconds that sometimes occur on December |
||
74 | 31 are ignored (their effect is below the accuracy threshold of the |
||
75 | algorithm). |
||
76 | |||
77 | References |
||
78 | ---------- |
||
79 | After Fortran code by A. D. Richmond, NCAR. Translated from IDL |
||
80 | by K. Laundal. |
||
81 | |||
82 | """ |
||
83 | # Convert from 4 digit year to 2 digit year |
||
84 | yr2 = year - 2000 |
||
85 | |||
86 | if year >= 2101 or year <= 1600: |
||
87 | raise ValueError('subsol valid between 1601-2100. Input year is:', year) |
||
88 | |||
89 | # Determine if this year is a leap year |
||
90 | nleap = np.floor((year - 1601) / 4) |
||
91 | nleap = nleap - 99 |
||
92 | if year <= 1900: |
||
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 | |||
209 |