The issue is clear: the diurnal formula uses Math.cos with a period of 24 hours but the loop only iterates h += 3, so the hour correctly represents local time — but the run time starts at 12z UTC, not local time. This means the diurnal peak (2PM local) gets mapped to the wrong hours. Should be fixed.